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 获得汉字拼音首字母的函数
Aug 01 PHP
在项目中寻找代码的坏命名
Jul 14 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
Apr 21 PHP
19个Android常用工具类汇总
Dec 30 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
6个超实用的PHP代码片段
Aug 10 PHP
深入理解PHP之源码目录结构与功能说明
Jun 01 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
laravel框架与其他框架的详细对比
Oct 23 PHP
yii2.0框架场景的简单使用示例
Jan 25 PHP
php将字符串转换为数组实例讲解
May 05 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/12/21 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
10款最好的Web开发的 Python 框架
2015/03/18 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
python实现简单的五子棋游戏
2020/09/01 Python
Java面试题:为什么要用Java
2012/05/11 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
锦旗赠语
2015/06/23 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers