PHP面向对象程序设计(OOP)之方法重写(override)操作示例


Posted in PHP onDecember 21, 2018

本文实例讲述了PHP面向对象程序设计(OOP)之方法重写(override)操作。分享给大家供大家参考,具体如下:

因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的,所以php是不能重载的。

虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了(重写父类方法)。

<?php
class Person
{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name, $sex, $age) {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
//这个人可以说话的方法, 说出自己的属性
function say() {
echo "my name is:" . $this->name . " sex:" . $this->sex . " my age is:" . $this->age;
}
}
//定义一个子类“学生类“使用”extends”关键字来继承”人”类:
class Student extends Person
{
var $school; //学生所在学校的属性
function __construct($name,$sex,$age,$school)
{
parent::__construct($name,$sex,$age);
$this->school = $school;
}
// 重写父类的say()方法
function say()
{
echo "my name is:" . $this->name ." my school is:" . $this->school;
}
//这个学生学习的方法
function study()
{
echo "my name is:" . $this->name . " my school is:" . $this->school;
}
}
?>

另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protectedpublic,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。

上面的例子, 我们就在“Student”子类里覆盖了继承父类里面的”say()”的方法,通过覆盖我们就实现了对“方法”扩展。但是,像这样 做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说“Person”类里面的“say()”方法有里面有 100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这 个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:

  • 一种是使用父类的“类名::“来调用父类中被覆盖的方法;
  • 一种是使用“parent::”的方试来调用父类中被覆盖的方法;
//定义一个子类“学生类“使用”extends”关键字来继承”人”类:
class Student extends Person
{
var $school; //学生所在学校的属性
function __construct($name,$sex,$age,$school)
{
parent::__construct($name,$sex,$age);
$this->school = $school;
}
// 重写父类的say()方法
function say()
{
//使用父类的"类名::"来调用父类中被覆盖的方法;
// Person::say();
//或者使用"parent::"的方试来调用父类中被覆盖的方法;
parent::say();
echo "my name is:" . $this->name ." my school is:" . $this->school;
}
//这个学生学习的方法
function study()
{
echo "my name is:" . $this->name . " my school is:" . $this->school;
}
}

现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非 常专业化的时候尤其是这样。 不要用代码中父类文字上的名字,应该用特殊的名字 parent,它指的就是子类在 extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP下MAIL的另一解决方案
Oct 09 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
destoon常用的安全设置概述
Jun 21 PHP
php实现高效获取图片尺寸的方法
Dec 12 PHP
PHP实现格式化文件数据大小显示的方法
Jan 03 PHP
详解YII关联查询
Jan 10 PHP
php文件缓存方法总结
Mar 16 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 PHP
PHP支付宝当面付2.0代码
Dec 21 #PHP
php json转换相关知识(小结)
Dec 21 #PHP
PHP后期静态绑定实例浅析
Dec 21 #PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 #PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 #PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 #PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 #PHP
You might like
php基础知识:控制结构
2006/12/13 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
python杀死一个线程的方法
2015/09/06 Python
用Django写天气预报查询网站
2018/10/21 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
认真学习保证书
2015/02/26 职场文书
费城故事观后感
2015/06/10 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
redis实现共同好友的思路详解
2021/05/26 Redis
Python学习开发之图形用户界面详解
2021/08/23 Python
javascript对象3个属性特征
2021/11/17 Javascript