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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
PHP stream_context_create()作用和用法分析
Mar 29 PHP
组合算法的PHP解答方法
Feb 04 PHP
php的array_multisort()使用方法介绍
May 16 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
php中file_exists函数使用详解
May 08 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 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调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
如何利用Python 进行边缘检测
2020/10/14 Python
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
如何写出好的Java代码
2014/04/25 面试题
英文版网络工程师求职信
2013/10/28 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
小学安全教育主题班会
2015/08/12 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
MySQL 分页查询的优化技巧
2021/05/12 MySQL
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
MYSQL如何查看操作日志详解
2022/05/30 MySQL