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 相关文章推荐
多文件上传的例子
Oct 09 PHP
一个程序下载的管理程序(三)
Oct 09 PHP
无数据库的详细域名查询程序PHP版(1)
Oct 09 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
判断PHP数组是否为空的代码
Sep 08 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
使用php计算排列组合的方法
Nov 13 PHP
浅析PHP文件下载原理
Dec 25 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
PHP命名空间namespace的定义方法详解
Mar 29 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
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
express框架下使用session的方法
2019/07/31 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Python单例模式的两种实现方法
2017/08/14 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
python中pivot()函数基础知识点
2021/01/03 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
招商经理岗位职责
2013/11/16 职场文书
财务简历的自我评价
2014/03/05 职场文书
优秀纪检干部材料
2014/08/27 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
学历证明范文
2015/06/16 职场文书
教师节随笔
2015/08/15 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS