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调用Java对象的方法
Oct 09 PHP
杏林同学录(六)
Oct 09 PHP
如何删除多级目录
Oct 09 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
php学习笔记之面向对象编程
Dec 29 PHP
如何用PHP实现插入排序?
Apr 10 PHP
php 批量替换程序的具体实现代码
Oct 04 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
使用php批量删除数据库下所有前缀为prefix_的表
Jun 09 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 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 不使用js实现页面跳转
2014/02/11 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
layui使用label标签的方法
2019/09/14 Javascript
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
python基于socket实现网络广播的方法
2015/04/29 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Python安装selenium包详细过程
2019/07/23 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
Python连接Impala实现步骤解析
2020/08/04 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
销售经理工作职责
2014/02/03 职场文书
教学改革实施方案
2014/03/31 职场文书
违纪学生保证书
2015/02/27 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server