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
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
实现获取http内容的php函数分享
Feb 16 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
php数组查找函数总结
Nov 18 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
php简单实现sql防注入的方法
Apr 22 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
php 多继承的几种常见实现方法示例
Nov 18 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版(4)
2006/10/09 PHP
php修改时间格式的代码
2011/05/29 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
Python实现程序的单一实例用法分析
2015/06/03 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
物流专业大学的自我评价
2014/01/11 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
法学专业自我鉴定
2014/02/05 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
优质护理服务心得体会
2016/01/22 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js