在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."。
";

}

}

//声明一个学生类,使用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."学习
";

}

//定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称

function say(){

echo "我的名字:".$this ->name.",性别:".$this ->sex.",年龄:".$this ->age.",在".$this ->school."学校上学
";

}

}

$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."。
";

}

}

//声明一个学生类,使用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."学习
";

}

//定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称

function say(){

parent::say(); //调用父类中被本方法覆盖掉的方法

echo "在".$this ->school."学校上学
";

}

}

$student= new Student("张三","男",20,"edu"); //创建一个学生对象,并传给一个学校名称参数

$student -> say(); //调用学生类中覆盖父类的说话方法

?>

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

php的parent_php中parent::是如何使用的?相关推荐

  1. maven项目pom.xml中parent标签的使用

    本文来说下maven项目pom.xml中parent标签的使用 文章目录 parent标签 parent标签由来 依赖排除 本文小结 parent标签 parent标签使用例子 <!--父项目的 ...

  2. linux 进程管理 task_struct 中 parent/children/sibling 成员的关系

    前言 最近在看<Linux内核设计与实现(原书第3版)>中第进程管理,有点疑问,上网顺便补习了linux内核链表第相关知识,在此记录下来. 疑问 书中写到: 3.2.6 进程家族树 ... ...

  3. springboot创建parent_创建springboot项目时,pom.xml中parent报错

    下载Maven 进入maven官网 http://maven.apache.org/download.cgi. 找到并点击apache-maven-3.6.2-bin.zipi.下载压缩包 配置Mav ...

  4. jQuery中 parent child 与 ance desc 的区别

    jQuery中< parent > child >与< ance desc >的区别 (1)< ance desc > 使用$("ance desc ...

  5. ATS 5.3.0中parent.config配置文件解读

    该博文翻译自参考文献[1] parent.config parent.config文件识别用在缓存分级中的父代理,用这个文件去执行下面的配置: 搭建父分级缓存,兼容多父级缓存和父级缓存故障转移 配置指 ...

  6. JQuery中parent(),parents(),parentsUntil()区别和使用技巧

    parent()其实很简单, 就是指定选择器中每个元素的外边的一层.比如$("p"),那么就是结果就是包裹着<p></p>的数据 如:<div> ...

  7. 亲测有效:spring boot中parent节点报错解决办法

    今天中午开始学习spring boot,结果一中午都卡在了pom.xml配置上.因为spring boot需要引入一个parent project, pom.xml文件中: <!-- Inher ...

  8. Spring Boot中parent标签的作用

    在Spring Boot的官方示例中,都是让我们继承一个spring的 spring-boot-starter-parent作为parent标签 <parent><groupId&g ...

  9. pom中parent标签使用

    maven的核心就是pom.xml,使用maven是为了更好的帮项目管理包依赖.如果要引入一个jar包,需要在pom文件中加上<dependency></dependency> ...

  10. SpringBoot的pom.xml中parent和starter的区别

    starter:是一个依赖包,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的.在dependency标签下,本质是依赖. parent:所有SpringBoot项目要继承的项目,定义了若干 ...

最新文章

  1. java aio_java中的AIO
  2. 第八周项目一-数组做数据成员(3)
  3. 洛谷P1020/CODEVS1044 导弹拦截(拦截导弹)
  4. Linux 多个发行版本被曝存在7年之久的提权漏洞
  5. 股票软件开发中全推与点播的区别
  6. 第1章 操作系统引论课后答案
  7. bootstrap EF_Bootstrap优秀模板INSPINIA.2.9.2
  8. 51单片机驱动TM1638芯片+Proteus仿真
  9. SAD算法的OpenCV实现
  10. 微信小程序登陆(两种写法)
  11. 内存颗粒位宽和容量_【科普】内存颗粒版本判断方法和编号解析V2.0
  12. 一个简单的例子来理解监督学习和非监督学习及其区别
  13. 物理学原理与工程应用期末复习之公式总结
  14. Java整合极光推送
  15. HTML用css把英文字母改大,CSS转换英文大小写text-transform属性
  16. 一文看懂25个神经网络模型,神经网络模型结构图
  17. 手工命令行打包java工程为war包
  18. LearnGL - 06.1 - Matrix - 矩阵02 - 向量空间、向量空间的维度、为何矩阵乘法要有 [M x N] * [N * P] 的 N 要相等的限制
  19. javascript 老王开车去东北
  20. 连续型Hopfield神经网络(SHNN)结构和特点及其能量函数

热门文章

  1. http状态码全解读
  2. 意间ai绘画怎么输入关键词,让图片变得好看?
  3. 小学三年级上册计算机计划书,小学生计划书
  4. 笔记本电脑亮度无法调节问题
  5. 什么是质量功能配置(QFD)(转载)
  6. OSG加载倾斜摄影数据
  7. matlab动图启动,MATLAB制作动图或视频
  8. EasyNLP 发布融合语言学和事实知识的中文预训练模型 CKBERT
  9. nu.xom:Serializer
  10. LTM系统并联接入方式数据包交互分析