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版本实现代码
Sep 15 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
微信扫描二维码登录网站代码示例
Dec 30 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
初识php MVC
Sep 10 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
Mar 25 PHP
php上传大文件设置方法
Apr 14 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP常用字符串函数小结(推荐)
Aug 05 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/12/13 PHP
组合算法的PHP解答方法
2012/02/04 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
使用k8s部署Django项目的方法步骤
2019/01/14 Python
Python实现Linux监控的方法
2019/05/16 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
酒店管理专业自荐信
2014/05/23 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
机器人总动员观后感
2015/06/09 职场文书
复活读书笔记
2015/06/29 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
golang特有程序结构入门教程
2021/06/02 Python
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python