PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
作者:Yeoman92 发布时间:2023-10-15 01:41:57
本文实例讲述了PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作。分享给大家供大家参考,具体如下:
在PHP中,会遇到这样的情况,子类继承父类,但是又需要对父类的属性和方法进行一定的扩展,这时子类可以对属性和方法进行重写,覆盖与父类同名的属性和方法,但是如果父类的方法中的内容比较多,比如上百成千行代码,这时只需使用”父类类名::方法” 或“parent::方法“来调用父类中被覆盖的方法,有就是重新载入父类,然后再加上需要扩展的语句。
方法的重写
<?php
class Person{
public $name;
public function __construct($name="" ){
$this->name=$name;
}
public function say(){
echo "我叫".$this->name ;
}
}
?>
<?php
class Student extends Person{
public $name;
public function __construct($name=""){
$this->name =$name;
}
//这里定义了一个和父类中同名的方法,将父类中的说话方法覆盖并重写
public function say(){
echo "我叫".$this->name .",今年25岁了" ;
}
}
?>
重写方法与访问权限
在子类覆盖父类的方法时要注意,在子类中重写的方法的访问权限一定不能低于父类被覆盖的方法的访问权限。例如父类中的方法的访问权限是protected,那么在子类中重写的方法的权限就要是protected或public。如果父类的方法是public权限,子类中要重写的方法只能是public。总之在子类中重写父类的方法时,一定要高于父类被覆盖的方法的权限。
重写时的参数数量
子类可以拥有与父类不同的参数数量,如下面的构造方法中,多添加了一个参数$age。
<?php
class Student extends Person{
public $name;
public $age;
public function __construct($name="",$age=25){
$this->name =$name;
$this->age =$age;
}
public function say(){
echo "我叫".$this->name .",今年".$this->age."岁了" ;
}
}
?>
上面的例子,通过覆盖我们就实现了对“方法”扩展。
但是,像这样做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说“Person”类里面的“say()”方法有里面有100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:
一种是使用父类的 “类名::
” 来调用父类中被覆盖的方法;
一种是使用 “parent::
” 的方试来调用父类中被覆盖的方法;
方法的扩展
<?php
class Student extends Person{
public $name;
public $age;
public function __construct($name="",$age=25){
parent::__construct($name,$age);
$this->age =$age;
}
public function say(){
parent::say();
echo ",今年".$this->age."岁了" ;
}
}
?>
上面所描述的只是重新加载了父类的属性和方法,不是真正意义上的重载,只能说是子类对父类进行了扩展,在php中,也存在重载(overloading)一词,但跟一般面向语言中的重载意义不同。
php中重载(overloading)参考: PHP面向对象_重载(overloading)
php中模拟一般面向语言中的方法重载,请参考:PHP面向对象_模拟一般面向对象语言中的方法重载
希望本文所述对大家PHP程序设计有所帮助。
来源:https://blog.csdn.net/Yeoman92/article/details/52815709
猜你喜欢
- 问题:用pycharm每次修改代码后第一次运行还是原来的结果,运行第二次的时候才是修改后代码的结果解决:每次修改代码后保存一下即可解决补充:
- 这里用到django-rest-framework-jwt这个库 https://github.com/GetBli
- 前言晚上坐在电脑面前,想着一边撸代码,一边听音乐。搜了搜自己想听的歌,奈何好多歌曲都提示需要版权,无法播放!没办法,想听歌还是得靠自己解决!
- 要想在ASP.NET项目中使用SQLite数据库,先需下载一个ADO.NET 2.0 SQLite Data Provider,下载地址为:
- 环境配置1:安装mysql,环境变量添加mysql的bin目录环境配置2:python安装MySQL-Python请根据自身操作系统下载安装
- 上节回顾主要讲了协程、进程、异步IO多路复用。 协程和IO多路复用都是单线程的。epoll 在linux下通过这个模块libev
- golang是一种强类型语言,虽然在代码中经常看到这种写法,i:=10这其实这是编译器自动做了类型推断在编译期间。编译器会对数据进行类型检查
- ie的javascript失效了,不是设置的问题那么就可能是以下几点问题了~安装KAV可能会破坏系统的javascript关联,失javas
- 本文实例讲述了python批量提交沙箱问题,分享给大家供大家参考。具体方法如下:出现的问题如下:1. Popen的使用,在linux下参数用
- 最小二乘法大部分的最小二乘法公式推导,都是使用的 代价函数偏导 的方式来求得的,在这里首先展示如何通过代价函数求偏导的方式得到最小二乘公式,
- git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另
- 本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*- # A
- 元数据简介元数据 (metadata) 最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据的信息”,日常生活中的图例、图书馆
- 大家好,我是辣条。曾经有一个真挚的机会,摆在我面前,但是我没有珍惜,等到失去的时候才后悔莫及,尘世间最痛苦的事莫过于此,如果老天可以再给我一
- 联合结果集 新建临时工数据表 代码如下:CREATE TABLE T_TempEmployee (FIdCardNumber VARCHAR
- 目录一、概念二、哪些函数支持三、占位符使用四、普通占位符1. %v、%+v、%#v2. %T3. %%五、布尔占位符六、整数占位符1. %b
- 前言在8之前的版本中,对于全局变量的修改,其只会影响其内存值,而不会持久化到配置文件中。数据库重启,又会恢复成修改前的值。从8开始,可通过S
- 前几天一直在寻找能够输出python函数运行时最大内存消耗的方式,看了一堆的博客和知乎,也尝试了很多方法,最后选择使用memory_prof
- django admin管理工具有很多好用的功能,例如搜索框、筛选器等,编码简单,功能强大。但是常规的时间筛选有一定局限性,只能显示一定时间
- 如下所示:#获取一个值在某个区间的指定倍数的值方法#1# print([i for i in range(1,101) if i%5==0]