PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解


Posted in PHP onJune 14, 2019

本文实例讲述了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,那么在子类中重写的方法的权限就要是protectedpublic。如果父类的方法是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程序设计有所帮助。

PHP 相关文章推荐
PHP安全配置
Oct 09 PHP
一个MYSQL操作类
Nov 16 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
PHP在线打包下载功能示例
Oct 15 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
PHP后台实现微信小程序登录
Aug 03 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 #PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 #PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 #PHP
PHP Cli 模式设置进程名称的方法
Jun 12 #PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
Jun 12 #PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 #PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 #PHP
You might like
五个PHP程序员工具
2008/05/26 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
会计专业大学生职业生涯规划书
2014/02/11 职场文书
倡议书范文
2014/04/16 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
2015年个人思想总结
2015/03/09 职场文书
消防验收申请报告
2015/05/15 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL
Go语言编译原理之源码调试
2022/08/05 Golang