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中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
PHP实现时间轴函数代码
Oct 08 PHP
PHP 透明水印生成代码
Aug 27 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
Jun 22 PHP
分享一个php 的异常处理程序
Jun 22 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
百万级别知乎用户数据抓取与分析之PHP开发
Sep 28 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
php之字符串变相相减的代码
2007/03/19 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
node.js开机自启动脚本文件
2014/12/24 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
JavaScript原生数组Array常用方法
2017/04/06 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
Python的lambda匿名函数的简单介绍
2013/04/25 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
Java面试题汇总
2015/12/06 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
数学国培研修感言
2014/02/13 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python