深入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安全配置方法
Jun 16 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
PHP编码规范之注释和文件结构说明
Jul 09 PHP
php 中的4种标记风格介绍
May 10 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
PHP中soap的用法实例
Oct 24 PHP
CI框架附属类用法分析
Dec 26 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 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 spl_autoload_register实现自动加载研究
2011/12/06 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
python聊天程序实例代码分享
2013/11/18 Python
Python Sleep休眠函数使用简单实例
2015/02/02 Python
浅谈python中的占位符
2017/11/09 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
电脑销售顾问自荐信
2014/01/29 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
市场总监岗位职责
2015/02/11 职场文书
肖申克救赎观后感
2015/06/02 职场文书
清洁工工作总结
2015/08/11 职场文书
个人业务学习心得体会
2016/01/25 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers