实例讲解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 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
转PHP手册及PHP编程标准
Dec 17 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
PHP 防注入函数(格式化数据)
Aug 08 PHP
几种有用的变型 PHP中循环语句的用法介绍
Jan 30 PHP
php使用session二维数组实例
Nov 06 PHP
PHP实现多文件上传的方法
Jul 08 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 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生成静态页面教程
2012/01/10 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
JS之小练习代码
2008/10/12 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
Python的信号库Blinker用法详解
2020/12/31 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
食品流通安全承诺书
2014/05/22 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang