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中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
WAF的正确bypass
Jan 05 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
详解PHP设计模式之依赖注入模式
May 25 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
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
PHP分页类集锦
2014/11/18 PHP
php实现的操作excel类详解
2016/01/15 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
详解javascript中对数据格式化的思考
2017/01/23 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
python getopt 参数处理小示例
2009/06/09 Python
Python科学画图代码分享
2017/11/29 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
大学专科自荐信
2014/06/17 职场文书
机械机修工岗位职责
2014/08/03 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python