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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
php实现网站插件机制的方法
Nov 10 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
php数据库备份还原类分享
Mar 20 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
PHP单例模式详细介绍
Jul 01 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
php封装的mongodb操作类代码
Aug 06 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
Jan 04 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实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
JavaScript 指导方针
2007/04/05 Javascript
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
javascript动画效果类封装代码
2007/08/28 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
vue鼠标悬停事件实例详解
2019/04/01 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
python基于ID3思想的决策树
2018/01/03 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
天猫精选:上天猫,就够了
2016/09/21 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
自荐信的格式
2014/03/10 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL