php实现parent调用父类的构造方法与被覆写的方法


Posted in PHP onFebruary 11, 2015

本文实例讲述了php实现parent调用父类的构造方法与被覆写的方法。分享给大家供大家参考。具体分析如下:

覆写:被重新设计。

在子类中定义构造方法时,需要传递参数给父类的构造方法,否则我们得到的可能是一个构造不完整的对象。

要调用父类的方法,首先要找到一个引用类本身的途径:句柄(handle),PHP为此提供了parent关键字。
 
parent 调用父类的构造方法

要引用一个类而不是对象的方法,可以使用 ::(两个冒号),而不是 ->。

所以, parent::__construct() 以为着调用父类的 __construct() 方法。

修改上篇《使用类继承解决代码重复等问题》中的代码,让每个类只处理自己的数据:

<?php

header('Content-type:text/html;charset=utf-8');

// 从这篇开始,类名首字母一律大写,规范写法

class ShopProduct{    // 声明类

public $title; // 声明属性

public $producerMainName;

public $producerFirstName;

public $price;

function __construct($title,$firstName,$mainName,$price){

$this -> title = $title;    // 给属性 title 赋传进来的值

$this -> producerFirstName= $firstName; 

$this -> producerMainName = $mainName; 

$this -> price= $price; 

}

function getProducer(){    // 声明方法

return "{$this -> producerFirstName }"."{$this -> producerMainName}";

}

function getSummaryLine(){

$base = "{$this->title}( {$this->producerMainName},";

$base .= "{$this->producerFirstName} )";

return $base;

}

}

class CdProduct extends ShopProduct {

public $playLenth;

function __construct($title,$firstName,$mainName,$price,$playLenth){

parent::__construct($title,$firstName,$mainName,$price);

$this -> playLenth= $playLenth;

}

function getPlayLength(){

return $this -> playLength;

}

function getSummaryLine(){

$base = "{$this->title}( {$this->producerMainName},";

$base .= "{$this->producerFirstName} )";

$base .= ":playing time - {$this->playLength} )";

return $base;

}

}

// 定义类

class BookProduct extends ShopProduct {

public $numPages;

function __construct($title,$firstName,$mainName,$price,$numPages){

parent::__construct($title,$firstName,$mainName,$price);

$this -> numPages= $numPages;

}

function getNumberOfPages(){

return $this -> numPages;

}

function getSummaryLine(){

$base = "{$this->title}( {$this->producerMainName},";

$base .= "{$this->producerFirstName} )";

$base .= ":page cont - {$this->numPages} )";

return $base;

}

}

 

?>

 
每个子类都会在设置自己的属性前调用父类的构造方法。基类(父类)现在仅知道自己的数据,而我们也应该尽量避免告诉父类任何关于子类的信息,这是一条经验规则,大家想想如果某个子类的信息应该是”保密“的,结果父类知道它的信息,其它子类可以继承,这样子类的信息就不保密了。

parent 调用父类被覆写的方法

parent 关键字可以在任何覆写父类的方法中使用。覆写一个父类的方法时,我们并不希望删除父类的功能,而是拓展它,通过在当前对象中调用父类的方法可以达到这个目的。

看看上面的代码,可以发现两个子类中 getSummaryLine() 方法中重复了许多代码,我们应该利用 ShopProduct 类中已经存在的功能,而不是重复开发:

// 父类:ShopProduct

function getSummaryLine(){

$base = "{$this->title}( {$this->producerMainName},";

$base .= "{$this->producerFirstName} )";

return $base;

}

// 子类:CdProduct

function getSummaryLine(){

$base = parent::getSummaryLine();

$base .= ":playing time - {$this->playLength} )";

return $base;

}

// 子类:BookProduct

function getSummaryLine(){

$base = parent::getSummaryLine();

$base .= ":page cont - {$this->numPages} )";

return $base;

}

 
我们在父类 ShopProduct 中为 getSummaryLine() 方法完成了”核心“功能,接着在子类中简单的调用父类的方法,然后增加更多数据到摘要字符串,方法的拓展就实现了。

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
PHP语法小结之基础和变量
Nov 22 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
浅谈PHP中的错误处理和异常处理
Feb 04 PHP
php base64 编码与解码实例代码
Mar 21 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
php使用类继承解决代码重复的问题
Feb 11 #PHP
php中使用url传递数组的方法
Feb 11 #PHP
php+Mysqli利用事务处理转账问题实例
Feb 11 #PHP
php使用iconv中文截断问题的解决方法
Feb 11 #PHP
php发送与接收流文件的方法
Feb 11 #PHP
php实现上传图片保存到数据库的方法
Feb 11 #PHP
php使用curl获取https请求的方法
Feb 11 #PHP
You might like
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
2017/05/13 jQuery
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
利用Python检测URL状态
2019/07/31 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
python3 简单实现组合设计模式
2020/07/02 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
酒店保安领班职务说明书
2014/03/04 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
如何书写邀请函?
2019/06/24 职场文书