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 相关文章推荐
使用MaxMind 根据IP地址对访问者定位
Oct 09 PHP
提升PHP速度全攻略
Oct 09 PHP
新手学PHP之数据库操作详解及乱码解决!
Jan 02 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
phpstrom使用xdebug配置方法
Dec 17 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
Jan 03 PHP
thinkphp文件引用与分支结构用法实例
Nov 26 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
May 09 PHP
php中array_slice和array_splice函数解析
Oct 18 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 PHP
php实现的数组转xml案例分析
Sep 28 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
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP最常用的正则表达式
2017/02/13 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
Python functools模块学习总结
2015/05/09 Python
Python reduce()函数的用法小结
2017/11/15 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
Python3.4解释器用法简单示例
2019/03/22 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
捐书活动总结
2014/05/04 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
大学生作弊检讨书
2014/09/11 职场文书
家庭困难证明
2014/10/12 职场文书
具结保证书
2015/01/17 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL