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速度全攻略
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
dedecms模版制作使用方法
Apr 03 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
php解析url的三个示例
Jan 20 PHP
php 访问oracle 存储过程实例详解
Jan 08 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
wordpress网站转移到本地运行测试的方法
Mar 15 PHP
浅析php如何实现爬取数据原理
Sep 27 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 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
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php eval函数用法总结
2012/10/31 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
PHP 中常量的知识整理
2017/04/14 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
使用python生成目录树
2018/03/29 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
德国高尔夫商店:Par71.de
2020/11/29 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
导购员的岗位职责
2014/02/08 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
授权委托书范本
2014/04/03 职场文书
演讲稿开场白台词
2014/08/25 职场文书
2015年团支部工作总结
2015/04/03 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
年终工作总结范文
2019/06/20 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL