php使用类继承解决代码重复的问题


Posted in PHP onFebruary 11, 2015

本文实例讲述了php使用类继承解决代码重复的问题。分享给大家供大家参考。具体分析如下:

继承直白地说就是给一个类建一个或多个子类,要创建子类就必须在类声明中使用 extends 关键字,新类名在前,extends 在中,父类名在后。
 
下例中,我们创建两个新类,BookProduct 和Cdproduct ,它们都继承自 ShopProduct 类。

<?php

header('Content-type:text/html;charset=utf-8');

// 从这篇开始,类名首字母一律大写,规范写法

class ShopProduct{    // 声明类

 public $numPages;   // 声明属性

 public $playLenth;

 public $title; 

 public $producerMainName;

 public $producerFirstName;

 public $price;

 function __construct($title,$firstName,$mainName,$price,$numPages=0,$playLenth=0){

  $this -> title = $title;    // 给属性 title 赋传进来的值

  $this -> producerFirstName= $firstName; 

  $this -> producerMainName = $mainName; 

  $this -> price= $price; 

  $this -> numPages= $numPages; 

  $this -> playLenth= $playLenth; 

 }

 function getProducer(){    // 声明方法

  return "{$this -> producerFirstName }"."{$this -> producerMainName}";

 }

 function getSummaryLine(){

  $base = "{$this->title}( {$this->producerMainName},";

  $base .= "{$this->producerFirstName} )";

  return $base;

 }

}
class CdProduct extends ShopProduct {

 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 {

 function getNumberOfPages(){

  return $this -> numPages;

 }

 function getSummaryLine(){

  $base = "{$this->title}( {$this->producerMainName},";

  $base .= "{$this->producerFirstName} )";

  $base .= ":page cont - {$this->numPages} )";

  return $base;

 }

}

?>

 
由于子类没有定义构造方法,所以在实例化 BookProduct 和Cdproduct 类时,会自动调用父类 ShopProduct 的构造方法。

子类默认继承了父类所有的 public 和 protected方法与属性(但没有继承 private 方法与属性,后面会讲到这三个关键字的作用)。也就是说,我们可以在从 Cdproduct 类实例化的对象中调用 getProducer() 方法,尽管 getProducer() 是在 ShopProduct 类中定义的。
 
将一下代码加到上面:

$product2 = new CdProduct("PHP面向对象","郭","碗瓢盆",7,null,"7小时");

print "美好生活:{$product2 -> getProducer()}<br>";

// 结果是:美好生活:郭碗瓢盆

这两个子类都继承了父类的公共部分,但注意, BookProduct 和Cdproduct 类都覆写了 getSummaryLine() 方法,提供了自己独特的实现,说明子类可以拓展和修改父类的功能。

但该方法在父类中的实现似乎有点多余,因为它的两个子类都重写了该方法,不过其他子类可能会用到它的基本功能。该方法的存在为客户端代码提供了保证:所有的 ShopProduct 对象都将有 getSummaryLine() 方法, BookProduct 和Cdproduct 都使用各自的 getSummaryLine() 方法访问 $title 属性。
 
可能一开始,继承是一个不太容易理解的概念。首先我们可以知道,通过定义一个从其他类继承而来的类,我们确保一个类拥有其自由的功能和父类的功能。然后就是子类的“搜索”功能,当我们调用 $product2 -> getProducer() 时,在 CdProduct 类中并没有找到 getProducer() 方法,那么就查找 ShopProduct 类中是否有这个方法,有就调用,没有则报错。对属性的访问也是同样的道理。
 
看看 ShopProduct 的构造方法,就会发现我们仍然在 基类(父类)中管理本应是子类处理的数据:BookProduct 应该处理 $numPages 参数和属性;Cdproduct 应该处理 $playLength 参数和属性。要完成这个工作,我们需要在子类中分别定义构造方法。

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP:风雨欲来 路在何方?
Oct 09 PHP
用PHP连mysql和oracle数据库性能比较
Oct 09 PHP
php中inlcude()性能对比详解
Sep 16 PHP
php断点续传之如何分割合并文件
Mar 22 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
PHP怎样用正则抓取页面中的网址
Aug 09 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 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
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 #PHP
You might like
PHP实现链式操作的核心思想
2015/06/23 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
jQuery中is()方法用法实例
2015/01/06 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
Python中获取网页状态码的两个方法
2014/11/03 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python标准库defaultdict模块使用示例
2015/04/28 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
python要安装在哪个盘
2020/06/15 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
瑜伽国际:Yoga International
2018/04/18 全球购物
《社戏》教学反思
2014/04/15 职场文书
创业融资计划书
2014/04/25 职场文书
司法局火灾防控方案
2014/06/05 职场文书
五一口号
2014/06/19 职场文书
会计学习心得体会
2014/09/09 职场文书
优秀党员申报材料
2014/12/18 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
MySQL索引失效场景及解决方案
2022/07/23 MySQL