实例讲解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 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
php发送post请求的三种方法
Feb 11 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 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+jQuery制作的列表分页的功能模块
2014/10/14 PHP
php测试kafka项目示例
2020/02/06 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
Python交互环境下实现输入代码
2018/06/22 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
信息专业个人的自我评价
2013/12/27 职场文书
20年同学聚会感言
2014/02/03 职场文书
中学家长会邀请函
2014/02/03 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
婚前协议书范本
2014/10/27 职场文书
2014个人年度工作总结
2014/12/15 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
警用民用对讲机找不同
2022/02/18 无线电
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript