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开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
使用php伪造referer的方法 利用referer防止图片盗链
Jan 20 PHP
php获取网页请求状态程序示例
Jun 17 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
php获取随机数组列表的方法
Nov 13 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
php封装的mysqli类完整实例
Oct 18 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 PHP
php与阿里云短信接口接入操作案例分析
May 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
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
2017/09/28 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python中文竖排显示的方法
2015/07/28 Python
Python 文件管理实例详解
2015/11/10 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
tensorflow常用函数API介绍
2020/04/19 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
财务会计实习报告体会
2013/12/20 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
优秀交警事迹材料
2014/01/26 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
法定代表人资格证明书
2015/06/18 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
CSS 伪元素::marker详解
2021/06/26 HTML / CSS