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下使用无限生命期Session的方法
Mar 16 PHP
有关PHP性能优化的介绍
Jun 20 PHP
php把session写入数据库示例
Feb 26 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
php实现从上传文件创建缩略图的方法
Apr 02 PHP
培养自己的php编码规范
Sep 28 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
php metaphone()函数的定义和用法
May 15 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP 超级全局变量相关总结
Jun 30 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
python生成器generator用法实例分析
2015/06/04 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
零基础小白多久能学会python
2020/06/22 Python
python怎么删除缓存文件
2020/07/19 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
新学期班主任寄语
2014/01/18 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
导游词之镜泊湖
2019/12/09 职场文书
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js