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
PHP中的日期及时间
Nov 23 PHP
PHP 字符串 小常识
Jun 05 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
PHP学习之数组值的操作
Apr 17 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
php实现过滤UBB代码的类
Mar 12 PHP
PHP文件读取功能的应用实例
May 08 PHP
php关闭warning问题的解决方法
May 17 PHP
php实现登陆模块功能示例
Oct 20 PHP
php递归函数怎么用才有效
Feb 24 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
4.与数据库的连接
2006/10/09 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
JavaScript DOM基础
2015/04/13 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
vue使用Google地图的实现示例代码
2018/12/19 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
python通过socket查询whois的方法
2015/07/18 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Django REST framework 分页的实现代码
2019/06/19 Python
pytorch标签转onehot形式实例
2020/01/02 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
Python线程threading模块用法详解
2020/02/26 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
linux面试相关问题
2013/04/28 面试题
爱护花草树木的标语
2014/06/11 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2015年酒店工作总结
2015/04/28 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
Python OpenCV 图像平移的实现示例
2021/06/04 Python