深入php多态的实现详解


Posted in PHP onJune 09, 2013

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性。

多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性。

在面向对象的软件开发中,多态性是最为重要的部分之一。面向对象编程并不只是将相关的方法与数据简单的结合起来,而是采用面向对象编程中的各种要素将现实生活中的各种情况清晰的描述出来。这一小节将对面向对象编程中的多态性作详细的讲解。

1.什么是多态
 
多 态(Polymorphism)按字面上意思理解就是“多种形状”。可以理解为多种表现形式,也即“一个对外接口,多个内部实现方法”。在面向对象的理论 中,多态性的一般定义为:同一个操作作用于不同的类的实例,将产生不同的执行结果。也即不同类的对象收到相同的消息时,将得到不同的结果。

在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子类对象之间所存在的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

2.多态的应用设计
 
在实际的应用开发中,通常为了使项目能够在以后的时间里的轻松实现扩展与升级,需要通过继承实现可复用模块进行轻松升级。在进行可复用模块设计时,就需要尽可能的减少使用流程控制语句。此时就可以采用多态实现该类设计。

【示例】例举了通常采用流程控制语句实现不同类的处理。其代码如下所示。

<?php
    class painter{                                    //定义油漆工类
        public function paintbrush(){                 //定义油漆工动作
            echo "油漆工正在刷漆!/n";
        }
    }
    class typist{                                    //定义打字员类
        public function typed(){                     //定义打字员工作
            echo "打字员正在打字!/n";
        }
    }
    function printworking($obj){                    //定义处理类
        if($obj instanceof painter){                //若对象是油漆工类,则显示油漆工动作
            $obj->paintbrush();
        }elseif($obj instanceof typist){            //若对象是打字员类,则显示打字员动作
            $obj->typed();
        }else{                                    //若非以上类,则显示出错信息
            echo "Error: 对象错误!";
        }
    }
    printworking(new painter());                    //显示员工工作
    printworking(new typist());                     //显示员工工作
?>

分析:在上述程序中,首先定义两个员工类:油漆工类和打字员类。然后定义一个处理函数,在该函数中,判断员工是否为已经定义的员工,打印出员工的工作状态。其结果如下所示。
油漆工正在刷漆 
打字员正在打字
从 以上程序可轻松看出,若想显示其几种员工的工作状态,需要首先定义该员工类,并在该员工类中定义员工的工作,然后在printworking()函数中增 加elseif语句以检查对象是哪一员工类的实例。这在实际的应用中,是非常不可取的。若此时采用多态,则可以轻松解决此问题。

可以首先创建一个员工父类,所有的员工类将继承自该员工父类,并且继承父类的所有方法与属性。然后在员工类中创建“是一”关系,判断是否为合法的员工。

【示例】例举了采用多态的方式改写上例。其代码如下所示。

<?php
class employee{//定义员工父类
protected function working(){//定义员工工作,需要在子类的实现
echo "本方法需要在子类中重载!";
}
}
class painter extends employee{//定义油漆工类
public function working(){//实现继承的工作方法
echo "油漆工正在刷漆!/n";
}
}
class typist extends employee{//定义打字员类
public function working(){
echo "打字员正在打字!/n";
}
}
class manager extends employee{//定义经理类
public function working(){
echo "经理正在开会!";
}
}
function printworking($obj){//定义处理方法
if($obj instanceof employee){//若是员工对象,则显示其工作状态
$obj->working();
}else{//否则显示错误信息
echo "Error: 对象错误!";
}
}
printworking(new painter());//显示油漆工的工作
printworking(new typist());//显示打字员的工作
printworking(new manager());//显示经理的工作
?>

分析:在上述程序中,首先定义一个员工基类,并定义一个员工工作状态的方法。然后定义将继承自员工基类的三个员工类:油漆工类、打字员类和经理类。然后定义显示员工工作状态的方法。并在该方法中创建一个“是一”关系,用于判断是否为合法的员工。其结果如下所示。
油漆工正在刷漆!
打字员正在打字!
经理正在开会!
从上例可发现,无论增加多少个员工类,只需要实现自员工父类继承的该员工类和方法。而无须修改显示员工工作状态的方法printworking()。  
PHP 相关文章推荐
用PHP制作静态网站的模板框架(一)
Oct 09 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
php语法检查的方法总结
Jan 21 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
tp5.1框架数据库子查询操作实例分析
May 26 PHP
深入PHP autoload机制的详解
Jun 09 #PHP
定义php常量的详解
Jun 09 #PHP
基于php冒泡排序算法的深入理解
Jun 09 #PHP
深入apache host的配置详解
Jun 09 #PHP
探讨如何在PHP开启gzip页面压缩实例
Jun 09 #PHP
基于PHP CURL用法的深入分析
Jun 09 #PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 #PHP
You might like
PHP 全角转半角实现代码
2010/05/16 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
PHP比你想象的好得多
2014/11/27 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
python实现12306火车票查询器
2017/04/20 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
Python Json数据文件操作原理解析
2020/05/09 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
师范生实习自我鉴定
2013/11/01 职场文书
计算机求职信
2013/12/01 职场文书
企业元宵节主持词
2014/03/25 职场文书
初中英语课后反思
2014/04/25 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL