PHP中子类重载父类的方法【parent::方法名】


Posted in PHP onMay 06, 2016

在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载。单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写。

子类中重载父类的方法就是在子类中覆盖从父类中继承过来的方法,父类中的方法被子类继承过来不就可以直接使用吗?为什么还要重载呢?因为有一些情况我们必须要覆盖的。例如,有一个“鸟”类,在这个类中定义了鸟的通用方法“飞翔”。将“鸵鸟”类作为它的子类,就会将“飞翔”的方法继承过来,但只要一调用“鸵鸟”类中的这个“飞翔”的方法,鸵鸟就会飞走。虽然鸵鸟是不会飞的,但其他特性都具有“鸟类”的特性,所以在声明“鸵鸟”类时还是可以继承“鸟”类的,但必须在“鸵鸟”类中将“鸟”类中继承过来的“飞翔”方法改写,就需要在子类中重载父类中的方法。

在下面的例子中,声明的Person类中有一个“说话”方法,Student类继承Person类后可以直接使用“说话”方法。但Person类中的“说话”方法只能说出它自己的成员属性,而Student类对Person类进行了扩展,多添加了几个新的成员属性。代码如下所示:

<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function __construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人类中声明一个通用的说话方法,介绍一下自己
function say(){
echo "我的名字:".$this-> name.",性别:".$this ->sex.",年龄:".$this ->age."。<br>";
}
}
//声明一个学生类,使用extends关键字扩展(继承)person类
class Student extends Person {
private $school; //在学生类中声明一个所在学校school的成员属性
//覆盖父类中的构造方法,在参数列表中添加一个学校属性,用来创建对象并初始化成员属性
function __construct($name="",$sex="男",$age=1,$school=""){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."学习<br>";
}
//定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称
function say(){
echo "我的名字:".$this ->name.",性别:".$this ->sex.",年龄:".$this ->age.",在".$this ->school."学校上学<br>";
}
}
$student= new Student("张三","男",20,"edu"); //创建一个学生对象,并传给一个学校名称参数
$student -> say(); //调用学生类中覆盖父类的说话方法
?>

改程序运行后输出的结果为:

我的名字叫:张三,性别:男,我的年龄是:20,在edu学校上学

在PHP中,提供了在子类重载的方法中调用父类被覆盖方法的功能。这样就可以在子类重写的方法中,继续使用从父类继承过来并被覆盖的方法,然后再按要求多添加一些新功能。调用的格式是使用“parent:方法名”在子类的重载方法中调用父类中被覆盖的方法。将上例中的代码修改一下,在子类重写的构造方法中使用“parent::__construct()”调用父类中被覆盖的构造方法,再多添加一条对子类中新扩展的成员属性初始化的代码。在子类中重写的say()方法中使用“parent::say()”调用父类中被覆盖的say()方法,再添加上输出子类成员属性的功能。

代码如下所示:

<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function __construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人类中声明一个通用的说话方法,介绍一下自己
function say(){
echo "我的名字:".$this-> name.",性别:".$this ->sex.",年龄:".$this ->age."。<br>";
}
}
//声明一个学生类,使用extends关键字扩展(继承)person类
class Student extends Person {
private $school; //在学生类中声明一个所在学校school的成员属性
//覆盖父类中的构造方法,在参数列表中添加一个学校属性,用来创建对象并初始化成员属性
function __construct($name="",$sex="男",$age=1,$school=""){
//调用父类中被覆盖的构造方法,为从父类中集成过来额出行赋初值
parent::__construct($name,$sex,$age);
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."学习<br>";
}
//定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称
function say(){
parent::say(); //调用父类中被本方法覆盖掉的方法
echo "在".$this ->school."学校上学<br>";
}
}
$student= new Student("张三","男",20,"edu"); //创建一个学生对象,并传给一个学校名称参数
$student -> say(); //调用学生类中覆盖父类的说话方法
?>

上面的例子输出的结果和前一个例子是一样的,但在本例中通过在子类中直接调用父类中被覆盖的方法要简便很多。另外,在子类覆盖父类的方法时一定要注意,在子类中重写的方法访问权限一定不能低于父类被覆盖的方法的访问权限。例如,如果父类中的访问权限是protected,那么在子类中重写的方法的权限就要是protected或public。

以上内容是小编给大家介绍的PHP中子类重载父类的方法【parent::方法名】的相关内容,希望对大家有所帮助!如果大家想了解更多资讯,敬请关注三水点靠木网站!

PHP 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
php中将时间差转换为字符串提示的实现代码
Aug 08 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
php实用代码片段整理
Nov 12 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
浅析PHP7 的垃圾回收机制
Sep 06 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 #PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 #PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
May 06 #PHP
zen_cart实现支付前生成订单的方法
May 06 #PHP
学习PHP的数组总结【经验】
May 05 #PHP
关于php中一些字符串总结
May 05 #PHP
php实现计算百度地图坐标之间距离的方法
May 05 #PHP
You might like
PHP使用Mysql事务实例解析
2014/09/08 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
定义select的边框颜色
2008/04/28 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
jQuery实现增删改查
2020/12/22 jQuery
js动态生成表格(节点操作)
2021/01/12 Javascript
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
求职自荐信
2013/12/14 职场文书
教师求职自荐信
2014/03/09 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
项目合作协议书
2014/04/16 职场文书
百日安全生产活动总结
2014/07/05 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
总经理助理岗位职责
2015/01/31 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
毕业论文致谢信
2015/05/14 职场文书
教师见习总结范文
2015/06/23 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
Python预测分词的实现
2021/06/18 Python
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android