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+Html+缓存
Nov 25 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
PHP实现文件上传功能实例代码
May 18 PHP
ThinkPHP5 验证器的具体使用
May 31 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
PHP使用递归按层级查找数据的方法
Nov 10 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
自己做矿石收音机
2021/03/02 无线电
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
PHP header函数分析详解
2011/08/06 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
Python编程中的for循环语句学习教程
2015/10/14 Python
json跨域调用python的方法详解
2017/01/11 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
市政施工员自我鉴定
2014/01/15 职场文书
年会主持词结束语
2014/03/27 职场文书
同居协议书范本
2014/04/23 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
销售辞职信范文
2015/03/02 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang