深入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的ASP防火墙
Oct 09 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
php命名空间学习详解
Feb 27 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
PHP flush 函数使用注意事项
Aug 26 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
thinkPHP和onethink微信支付插件分享
Aug 11 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
linux iconv方法的使用
2011/10/01 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
新闻内页-JS分页
2006/06/07 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
javascript实现限制上传文件大小
2015/02/06 Javascript
javascript实现完美拖拽效果
2015/05/06 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
vue如何判断dom的class
2018/04/26 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
Python PIL图片添加字体的例子
2019/08/22 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
工艺工程师工作职责
2013/11/23 职场文书
户外活动策划方案
2014/03/12 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
医院合作协议书
2014/08/19 职场文书
2014年药店工作总结
2014/11/20 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL