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 相关文章推荐
利用js调用后台php进行数据处理原码
Oct 09 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
php 安全过滤函数代码
May 07 PHP
php自动加载机制的深入分析
Jun 08 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
php与c 实现按行读取文件实例代码
Jan 03 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 PHP
php双向队列实例讲解
Nov 17 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
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
php绘制一条弧线的方法
2015/01/24 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
php中请求url的五种方法总结
2017/07/13 PHP
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
JsChart组件使用详解
2018/03/04 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
vue resource发送请求的几种方式
2019/09/30 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
js判断密码强度的方法
2020/03/18 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Django 静态文件配置过程详解
2019/07/23 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
医学院学生的自我评价分享
2013/11/19 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
护士医德医风自我评价
2014/09/15 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
《赵州桥》教学反思
2016/02/17 职场文书