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语法(1)
Oct 09 PHP
精通php的十大要点(上)
Feb 04 PHP
php学习之数据类型之间的转换代码
May 29 PHP
PHP常用技巧总结(附函数代码)
Feb 04 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
php生成shtml类用法实例
Dec 09 PHP
php获取系统变量方法小结
May 29 PHP
深入理解PHP类的自动载入机制
Sep 16 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 PHP
浅谈php使用curl模拟多线程发送请求
Mar 08 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
Oct 11 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 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中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
JavaScript 高效运行代码分析
2010/03/18 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
python实现简单图书管理系统
2019/11/22 Python
python dumps和loads区别详解
2020/02/04 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
竞选村长演讲稿
2014/04/28 职场文书
青安岗事迹材料
2014/05/14 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
个人租房协议书范本
2014/09/30 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
Python中npy和mat文件的保存与读取
2022/04/24 Python