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 radio 单选框获取与保持值的实现代码
May 15 PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
PHP bin2hex()函数基础实例讲解
Feb 11 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 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/07/08 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
python生成器推导式用法简单示例
2019/10/08 Python
Python切图九宫格的实现方法
2019/10/10 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
巴西手表购物网站:eclock
2019/03/19 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
会计大学生职业生涯规划书范文
2014/01/13 职场文书
高中军训感言500字
2014/02/24 职场文书
课外活动总结范文
2014/07/09 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
员工辞职信怎么写
2015/02/27 职场文书
教师节倡议书2015
2015/04/27 职场文书
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL