深入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 29 PHP
PHP GD 图像处理组件的常用函数总结
Apr 28 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
PHP unset函数原理及使用方法解析
Aug 14 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php数组去重的函数代码
2013/02/03 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
js实现时钟定时器
2020/03/26 Javascript
python算法学习之基数排序实例
2013/12/18 Python
python多线程编程中的join函数使用心得
2014/09/02 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
德国足球商店:OUTFITTER
2019/05/06 全球购物
改革共识倡议书
2014/08/29 职场文书
2015年招生工作总结
2015/05/04 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
检讨书之工作不认真
2019/08/14 职场文书
python glom模块的使用简介
2021/04/13 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript