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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
PHP Mysql编程之高级技巧
Aug 27 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
PHP文件上传操作实例详解
Sep 27 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
yii gridview实现时间段筛选功能
Aug 15 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 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php 获取本地IP代码
2013/06/23 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
微信小程序 引入es6 promise
2017/04/12 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
Python命令行解析模块详解
2018/02/01 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
浅谈Python爬虫基本套路
2019/03/25 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Python之字典对象的几种创建方法
2020/09/30 Python
农业资源与环境专业自荐信范文
2013/12/30 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
工作所在部门证明
2014/09/21 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
民主评议党员总结
2014/10/20 职场文书
2014年团委工作总结
2014/11/13 职场文书
师范生小学见习总结
2015/06/23 职场文书
CSS极坐标的实例代码
2021/06/03 HTML / CSS
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis