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数组实例总结与说明
Aug 23 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
国产PHP开发框架myqee新手快速入门教程
Jul 14 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
PHP实现的增强性mhash函数
May 27 PHP
thinkPHP下的widget扩展用法实例分析
Dec 26 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
自制PHP框架之路由与控制器
May 07 PHP
PHP attributes()函数讲解
Feb 03 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
JAVA/JSP学习系列之六
2006/10/09 PHP
PHP 和 HTML
2006/10/09 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
jQuery find和children方法使用
2011/01/31 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
详谈python http长连接客户端
2017/06/12 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
python 命名规范知识点汇总
2020/02/14 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
方正Java笔试题
2014/07/03 面试题
项目经理岗位职责
2013/11/11 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
成绩单家长评语大全
2014/04/16 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
关于倡议书的范文
2015/04/29 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
postgresql中如何执行sql文件
2023/05/08 PostgreSQL