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 相关文章推荐
PHP递归返回值时出现的问题解决办法
Feb 19 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
phalcon框架使用指南
Feb 23 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
简单谈谈PHP中的trait
Feb 25 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 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 json转换成数组形式代码分享
2014/11/10 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
解释一下抽象方法和抽象类
2016/08/27 面试题
Android面试题及答案
2015/09/04 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
大学生求职中的自我评价
2013/10/01 职场文书
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
思想汇报范文
2013/11/04 职场文书
公司经理任命书
2014/06/05 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
高中生毕业评语
2014/12/30 职场文书
考试后的感想
2015/08/07 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
干部理论学习心得体会
2016/01/21 职场文书
《绝招》教学反思
2016/02/20 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
python字符串的一些常见实用操作
2022/04/06 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android