实例讲解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 将字符串按大写字母分隔成字符串数组
Apr 30 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
Jun 12 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
thinkPHP下ueditor的使用方法详解
Dec 26 PHP
关于php中一些字符串总结
May 05 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
PHP变量的作用范围实例讲解
Dec 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 获取完整url地址
2008/12/20 PHP
Yii中表单用法实例详解
2016/01/05 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
广告显示判断
2006/08/31 Javascript
jQuery 1.0.2
2006/10/11 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
element-ui表格数据转换的示例代码
2018/08/24 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Flask-WTF表单的使用方法
2019/07/12 Python
Python jieba库用法及实例解析
2019/11/04 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
python可以用哪些数据库
2020/06/22 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
小学教师国培感言
2014/02/08 职场文书
房屋出售协议书
2014/04/10 职场文书
文明好少年事迹材料
2014/08/19 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
2016年国培研修日志
2015/11/13 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
Spring实现内置监听器
2021/07/09 Java/Android
Golang中channel的原理解读(推荐)
2021/10/16 Golang
python程序的组织结构详解
2021/12/06 Python
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS