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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
第1次亲密接触PHP5(2)
Oct 09 PHP
php 中英文语言转换类
Sep 07 PHP
PHP中其实也可以用方法链
Nov 10 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
使用array_map简单搞定PHP删除文件、删除目录
Oct 29 PHP
php获取当月最后一天函数分享
Feb 02 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 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脚本
2006/11/26 PHP
php 随机生成10位字符代码
2009/03/26 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
react同构实践之实现自己的同构模板
2019/03/13 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
python3大文件解压和基本操作
2017/12/15 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
postman和python mock测试过程图解
2020/02/22 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
Python爬虫与反爬虫大战
2020/07/30 Python
浅析python连接数据库的重要事项
2021/02/22 Python
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
优秀党员主要事迹
2014/01/19 职场文书
大学生工作自荐书
2014/06/16 职场文书
节水口号标语
2014/06/19 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
安全保证书
2015/01/16 职场文书
行政经理岗位职责
2015/04/15 职场文书
导游词之江西赣州
2019/10/15 职场文书