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 array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php cli 小技巧
Jun 03 PHP
php简单实现快速排序的方法
Apr 04 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
php基于session实现数据库交互的类实例
Aug 03 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
PHP fopen函数用法实例讲解
Feb 15 PHP
PHP下载文件函数与用法示例
Sep 27 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
PHP连接MySQL数据库三种实现方法
Dec 10 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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编程与应用
2006/10/09 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php实现简单加入购物车功能
2017/03/07 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
js 获取元素下面所有li的两种方法
2014/04/14 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
Python 中字符串拼接的多种方法
2018/07/30 Python
python生成n个元素的全组合方法
2018/11/13 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
python中的unittest框架实例详解
2021/02/05 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
人力资源管理专业应届生求职信
2013/09/28 职场文书
便利店的创业计划书
2014/01/15 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
财务会计岗位职责
2015/02/03 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript