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生成html分页列表的代码
Mar 18 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
yii框架builder、update、delete使用方法
Apr 30 PHP
php表单请求获得数据求和示例
May 15 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
Oct 20 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP文件缓存smarty模板应用实例分析
Feb 26 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 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基础之运算符的使用方法
2013/04/28 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
python实现问号表达式(?)的方法
2013/11/27 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
详解python算法之冒泡排序
2019/03/05 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
python如何调用java类
2020/07/05 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
师范毕业生自我鉴定
2014/01/15 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python