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语法(5)
Oct 09 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
PHP 字符串 小常识
Jun 05 PHP
PHP 实用代码收集
Jan 22 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
PHP 实现缩略图
Mar 09 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下连接mssql2005的代码
2011/01/17 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Django框架安装方法图文详解
2019/11/04 Python
Python3监控疫情的完整代码
2020/02/20 Python
Python pymsql模块的使用
2020/09/07 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
Python如何定义一个函数
2015/09/01 面试题
质量月活动策划方案
2014/03/10 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript