实例讲解PHP面向对象之多态


Posted in PHP onAugust 20, 2014

什么是多态性?

多态性是继数据库抽象和继承后,面向对象语言的第三个特征。多态即多种形态,具有表现多种形态的能力特征。在面向对象中表示根据对象的类型以不同方式处理。多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性。

如我们创建一个doing()方法,如果是学生则打印上课,如是公司职员则打印上班。

普通做法

使用if判断

/**

 * PHP多态性

 * 琼台博客

 */

 

// 定义学生类

class student{

    public function cla(){

            echo "学生工正在上课!<br />";

    }

}

 

// 定义职员类

class office{                              

        public function Wor(){

            echo "职员正在上班!<br />";

        }

}

 

// 判断对象类型方法

function doing($obj){ 

        if($obj instanceof student){ 

            $obj->cla();

        }elseif($obj instanceof office){

            $obj->wor();

        }else{

            echo "没有这个对象!";

        }

}

 

doing(new student()); // 学生正在上课

doing(new office());  // 职员正在上班

以上结果输出:

学生正在上课
职员正在上班

这种普通方法有个缺点,就是对象如果很多,那么if..else..很长,不灵活。
 
多态性做法

定义一个公共抽象方法,所有子类继承它。

/**

 * PHP多态性

 * 琼台博客

 */

 

// 定义一个公共类

class pub{

    protected function working(){

        echo "本方法需要在子类中重载!";

    }

}

 

// 定义学生类,继承公共类pub

class student extends pub{

    public function working(){

        echo "学生工正在上课!<br />";

    }

}

 

// 定义职员类,继承公共类pub

class office extends pub{

        public function working(){

        echo "职员正在上班!<br />";

        }

}

 

// 判断对象类型方法

function doing($obj){ 

        if($obj instanceof pub){ 

            $obj->working();

        }else{

            echo "没有这个对象!";

        }

}

 

doing(new student()); // 学生正在上课

doing(new office());  // 职员正在上班

这就是多态的特性,灵活重用。
 
其它做法

从多态性的实现方式来看,无非就规范了每个类都要重载父类的一个方法,从而达到统一效果。而我们在定义类的时候,自行加上统一的方法也可行。因此以上例子也可以这么实现:

/**

 * PHP多态性

 * 琼台博客

 */

 

// 定义学生类

class student{

    // 定义统一的方法pub

    public function pub(){

        echo "学生工正在上课!<br />";

    }

}

 

// 定义职员类

class office{

    // 定义统一的方法pub

        public function pub(){

        echo "职员正在上班!<br />";

        }

}

 

// 判断对象类型方法

function doing($obj){ 

    if($obj){

        // 调用类的统一方法

            $obj->pub();

    }else{

        echo '没有这个对象';  

    }

}

 

doing(new student()); // 学生正在上课

doing(new office());  // 职员正在上班

当然,以上的例子不能说明多态性就能使用这样的方式搞定,毕竟多态性在复杂的程序设计中,它能有效的达到灵活重用的特性。

多态性也可以理解为一种程序设计方式,而程序设计最终目的无非就是:灵活,多态,重用,高效。

PHP 相关文章推荐
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
php+js实现异步图片上传实例分享
Jun 02 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
php中实现记住密码下次自动登录的例子
Nov 06 PHP
PHP实现的增强性mhash函数
May 27 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
Python中使用django form表单验证的方法
Jan 16 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
图解找出PHP配置文件php.ini的路径的方法
Aug 20 #PHP
Linux下PHP连接Oracle数据库
Aug 20 #PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 #PHP
对PHP新手的一些建议(PHP学习经验总结)
Aug 20 #PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 #PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 #PHP
Smarty变量调节器失效的解决办法
Aug 20 #PHP
You might like
一个更简单的无限级分类菜单代码
2007/01/16 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
基于header的一些常用指令详解
2013/06/06 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
jquery实现页面图片等比例放大缩小功能
2014/02/12 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
Python yield 使用浅析
2015/05/28 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
入党转预备思想汇报
2014/01/07 职场文书
2014年中班元旦活动方案
2014/02/14 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python