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数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php实现图片缩略图的方法
Mar 29 PHP
PHP微信开发之查询微信精选文章
Jun 23 PHP
PHP实现bitmap位图排序与求交集的方法
Jul 28 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
Oct 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使之能同时支持GIF和JPEG
2006/10/09 PHP
Laravel框架表单验证详解
2014/09/04 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
整理Python中的赋值运算符
2015/05/13 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
Python有序字典简单实现方法示例
2017/09/28 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
统计员岗位职责
2013/11/14 职场文书
家长对孩子评语
2014/01/30 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
答谢会策划方案
2014/05/12 职场文书
社区矫正工作方案
2014/06/04 职场文书
大学生实训报告总结
2014/11/05 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
Django显示可视化图表的实践
2021/05/10 Python
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
python利用while求100内的整数和方式
2021/11/07 Python
php解析非标准json、非规范json的方式实例
2022/05/10 PHP