实例讲解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 相关文章推荐
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
PHP5中使用DOM控制XML实现代码
May 07 PHP
php下目前为目最全的CURL中文说明
Aug 01 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
Jan 06 PHP
PHP 自定义错误处理函数的使用详解
May 10 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
php编写的简单页面跳转功能实现代码
Nov 27 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
php返回当前日期或者指定日期是周几
May 21 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
利用ajax和PHP实现简单的流程管理
Mar 23 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
php中的MVC模式运用技巧
2007/05/03 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
JS验证码实现代码
2017/09/14 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
ES6箭头函数和扩展实例分析
2020/05/23 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
让 python 命令行也可以自动补全
2014/11/30 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
Python内存映射文件读写方式
2020/04/24 Python
keras.layer.input()用法说明
2020/06/16 Python
就业推荐表自我鉴定范文
2014/03/21 职场文书
销售活动策划方案
2014/08/26 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
网络研修心得体会
2016/01/08 职场文书
Android存储中最基本的文件存储方式
2022/04/30 Java/Android