实例讲解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生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
Laravel 4 初级教程之安装及入门
Oct 30 PHP
php读取csc文件并输出
May 21 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
phpstudy的php版本自由修改的方法
Oct 18 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 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编写大型网站问题集
2007/03/06 PHP
php在线代理转向代码
2012/05/05 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
js 表格隔行颜色
2009/12/02 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
Python中http请求方法库汇总
2016/01/06 Python
Python星号*与**用法分析
2018/02/02 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
python实现批量命名照片
2020/06/18 Python
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
运动会开幕式邀请函
2014/02/03 职场文书
分公司负责人任命书
2014/06/04 职场文书
营业员岗位职责
2015/02/11 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书