php面向对象全攻略 (十五) 多态的应用


Posted in PHP onSeptember 30, 2009

多态的应用
多态是除封装和继承之外的另一个面向对象的三大特性之一,我个人看来PHP 中虽然可
以实现多态,但和C++还有Java 这些面向对象的语言相比,多态性并不是那么突出,因为PHP
本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对
象的问题,所以多态的应用并不是那么的明显;所谓多态性是指一段程序能够处理多种类型
对象的能力,比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不
同的员工或是不同职位的员工,都是通过这个方法发放的,但是所发的工资都是不相同的。
所以同一个发工资的方法就出现了多种形态。对于面向对象的程序来说,多态就是把子类对
象赋值给父类引用,然后调用父类的方法,去执行子类覆盖父类的那个方法,但在PHP 里是
弱类型的,对象引用都是一样的不分父类引用,还是子类引用。
我们现在来看一个例子,首先还是要使用多态就要有父类对象和子类对象的关系。做一
个形状的接口或是抽象类做为父类,里面有两个抽象方法,一个求周长的方法,另一个是求
面积的方法;这接口的子类是多种不同的形状,每个形状又都有周长和面积,又因为父类是
一个接口,所以子类里面就必须要实现父类的这两个周长和面积的抽象方法,这样做的目的
是每种不同形状的子类都遵守父类接口的规范,都要有求周长和求面积的方法。
代码片段

<? 
//定义了一个形状的接口,里面有两个抽象方法让子类去实现 
interface Shape{ 
function area(); 
function perimeter(); 
} 
//定义了一个矩形子类实现了形状接口中的周长和面积 
class Rect implements Shape{ 
private $width; 
private $height; 
function __construct($width, $height){ 
$this->width=$width; 
$this->height=$height; 
} 
function area(){ 
return "矩形的面积是:".($this->width*$this->height); 
} 
function perimeter(){ 
return "矩形的周长是:".(2*($this->width+$this->height)); 
} 
} 
//定义了一个圆形子类实现了形状接口中的周长和面积 
class Circular implements Shape{ 
private $radius; 
function __construct($radius){ 
$this->radius=$radius; 
} 
function area(){ 
return "圆形的面积是:".(3.14*$this->radius*$this->radius); 
} 
function perimeter(){ 
return "圆形的周长是:".(2*3.14*$this->radius); 
} 
} 
//把子类矩形对象赋给形状的一个引用 
$shape=new Rect(5, 10); 
echo $shape->area()."<br>"; 
echo $shape->perimeter()."<br>"; 
//把子类圆形对象赋给形状的一个引用 
$shape=new Circular(10); 
echo $shape->area()."<br>"; 
echo $shape->perimeter()."<br>"; 
?>

上例执行结果:
执行结果
矩形的面积是:50
矩形的周长是:30
圆形的面积是:314
圆形的周长是:62.8
通过上例我们看到,把矩形对象和圆形对象分别赋给了变量$shape,调用$shape 引用中
的面积和周长的方法,出现了不同的结果,这就是一种多态的应用,其实在我们PHP 这种弱
类形的面向对象的语言里面,多态的特性并不是特别的明显,其实就是对象类型变量的变项
应用。
PHP 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php学习笔记之基础知识
Nov 08 PHP
Opcache导致php-fpm崩溃nginx返回502
Mar 02 PHP
php实现的通用图片处理类
Mar 24 PHP
PHP四种基本排序算法示例
Apr 09 PHP
php实现SAE上使用storage上传与下载文件的方法
Jun 29 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 #PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
Sep 30 #PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 #PHP
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 #PHP
php面向对象全攻略 (九)访问类型
Sep 30 #PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 #PHP
php面向对象全攻略 (七) 继承性
Sep 30 #PHP
You might like
smarty循环嵌套用法示例分析
2016/07/19 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
用JQuery调用Session的实现代码
2010/10/29 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
js中eval详解
2012/03/30 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
2015/03/30 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
浅析vue数据绑定
2017/01/17 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python 写入csv乱码问题解决方法
2016/10/23 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
python解释器spython使用及原理解析
2019/08/24 Python
Python解析多帧dicom数据详解
2020/01/13 Python
python os.rename实例用法详解
2020/12/06 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
大学活动邀请函
2014/01/28 职场文书
给客户的感谢信
2015/01/21 职场文书
2015年中个人总结范文
2015/03/10 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书