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 相关文章推荐
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP中实现获取IP和地理位置类分享
Feb 10 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
PHP类的自动加载机制实现方法分析
Jan 10 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中的正规表达式(一)
2006/10/09 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python中的装饰器详解
2015/04/13 Python
python的keyword模块用法实例分析
2015/06/30 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
大学生饮食连锁店创业计划书
2014/01/17 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
世博会口号
2014/06/20 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
师德承诺书
2015/01/20 职场文书
西安兵马俑导游词
2015/02/02 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android