深入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 memcache扩展的三种安装方法
Apr 26 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
深入解析php中的foreach问题
Jun 30 PHP
php中自定义函数dump查看数组信息类似var_dump
Jan 27 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
php提高网站效率的技巧
Sep 29 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
May 09 PHP
CodeIgniter集成smarty的方法详解
May 26 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 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实现获取中英文首字母
2015/06/19 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
对Python中内置异常层次结构详解
2018/10/18 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
python3实现弹弹球小游戏
2019/11/25 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
Java基础面试题
2012/11/02 面试题
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
大学生求职信例文
2014/06/29 职场文书
党校个人总结
2015/03/04 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
Nginx速查手册及常见问题
2022/04/07 Servers