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函数utf8转gb2312编码
Dec 21 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
php中session使用示例
Mar 29 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
Feb 15 PHP
php中关于socket的系列函数总结
May 18 PHP
PHP实现递归无限级分类
Oct 22 PHP
php无法连接mysql数据库的正确解决方法
Jul 01 PHP
PHP CURL中传递cookie的方法步骤
May 09 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
一个高ai的分页函数和一个url函数
2006/10/09 PHP
php添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
枚举JavaScript对象的函数
2006/12/22 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
优化javascript的执行速度
2010/01/23 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
公司委托书怎么写
2014/08/02 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
药店采购员岗位职责
2014/09/30 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
5个实用的JavaScript新特性
2022/06/16 Javascript