深入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内核介绍及扩展开发指南―基础知识
Sep 11 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
PHP获取服务器端信息的方法
Nov 28 PHP
PHP查找与搜索数组元素方法总结
Jun 12 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
Laravel ORM 数据model操作教程
Oct 21 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 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数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
php微信开发之关注事件
2018/06/14 PHP
php支付宝APP支付功能
2020/07/29 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
javascript getElementsByClassName实现代码
2010/10/11 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
python冒泡排序简单实现方法
2015/07/09 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
心得体会开头
2014/01/01 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
世界环境日活动总结
2015/02/11 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
Redis基本数据类型String常用操作命令
2022/06/01 Redis