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之第六天
Oct 09 PHP
PHP个人网站架设连环讲(二)
Oct 09 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
Yii2框架使用计划任务的方法
May 25 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
Yii针对添加行的增删改查操作示例
Oct 18 PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 PHP
Laravel配合jwt使用的方法实例
Oct 25 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
使用 php4 加速 web 传输
2006/10/09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
测试php函数的方法
2013/11/13 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
Javascript 布尔型分析
2008/12/22 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
微信小程序tabbar底部导航
2018/11/05 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
Python之py2exe打包工具详解
2017/06/14 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
python opencv摄像头的简单应用
2019/06/06 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python conda操作方法
2019/09/11 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
干部行政关系介绍信
2014/01/17 职场文书
中英文求职信范文
2015/03/19 职场文书