PHP5多态性与动态绑定介绍


Posted in PHP onApril 03, 2015

什么是多态性?

多态性是继数据抽象和继承后,面向对象语言的第三个特征。从字面上理解,多态的意思是“多种形态”,简单来说,多态是具有表现多种形态的能力的特征,在OO中是指“语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式”的能力。多态被认为是面向对象语言的必备特性。

例如:

我们创建一个接口 Shape,定义一个空的方法 draw(),那么所有的实现类都必须实现这个方法,假设 Shape 有两个实现类:Triangle 和 Rectangle,我们虽然无法通过类似这样的 Java 代码来诠释 PHP 的多态性:

Shape s = new Triangle();

s.draw();

不过 PHP5.1 中引入了 Type Hinting,可以限制函数(或者方法)的参数类型,我们使用这个特性来演示 PHP5 的多态性。

参考如下的代码:

class TestPolymorphism {

    public function drawNow(Shape $shape) {

        $shape->draw();

    }

}

函数 drawNow() 中限制传入的参数类型必须为 Shape 接口派生类的对象,这里我们传递给 drawNow() 的参数可能是 Triangle 或者 Rectangle 的对象,也可能是其它的 Shape 接口的派生类对象,比如 Circle 等等,简单的说 drawNow() 的参数类型是无法预知的,$shape->draw() 的行为最终由传入的参数的具体类型来决定,比如如果传入 Triangle 的对象,那么就调用 Triangle 的 draw() 方法,如果传入 Rectangle 的对象,就调用 Rectangle 的 draw() 方法。这种在运行时刻根据传递的对象参数的类型来决定调用哪一个对象的方法的行为就可以称之为多态。

Shape 也可以是一个抽象基类或者是非抽象的基类,上面的论述都是成立的。区别在于接口仅定义一套实现类必须遵守的规则,而使用基类则可以为派生类提供一些缺省的行为。

参考代码如下:

/**

 * Shape Interface

 * 

 * @version 1.0

 * @copyright 

 */

interface Shape {

    public function draw();

}

 

/**

 * Triangle 

 * 

 * @uses Shape

 * @version 1.0

 * @copyright

 */

class Triangle implements Shape {   

    public function draw() {

        print "Triangle::draw()\n";

    }

}

 

/**

 * Rectangle 

 * 

 * @uses Shape

 * @version 1.0

 * @copyright

 */

class Rectangle implements Shape {

    public function draw() {

        print "Rectangle::draw()\n";

    }

}

 

/**

 * Test Polymorphism

 * 

 * @version 1.0

 * @copyright

 */

class TestPoly {

    public function drawNow(Shape $shape) {

        $shape->draw();

    }

}

 

 

$test = new TestPoly();

$test->drawNow(new Triangle());

$test->drawNow(new Rectangle());

 

/* vim: set expandtab tabstop=4 shiftwidth=4: */

什么是动态绑定?

HaoHappy 翻译的 PHP5 Object Pattern 第九节中有介绍:

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问。 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。

另有的说法:

绑定(binding):将方法的调用连到方法本身被称为绑定,当绑定发生在编译期,被称做静态绑定,而在程序运行的时候根据对象的类型来决定该绑定方法的成为动态绑定。

PHP 是一种动态语言,使用动态绑定。无须考虑采取何种绑定策略,因为一起都是自动的。

PHP 相关文章推荐
php is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
php调用google接口生成二维码示例
Apr 28 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
Aug 12 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP+MySQL实现消息队列的方法分析
May 09 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
Apr 03 #PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 #PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 #PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 #PHP
php实现专业获取网站SEO信息类实例
Apr 02 #PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 #PHP
php实现从上传文件创建缩略图的方法
Apr 02 #PHP
You might like
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
浅析php工厂模式
2014/11/25 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
php加密解密字符串示例
2016/10/13 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
用javascript操作xml
2006/11/04 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
js切换光标示例代码
2013/10/10 Javascript
浅谈javascript的调试
2015/01/28 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python递归计算N!的方法
2015/05/05 Python
python实现简单socket通信的方法
2016/04/19 Python
python实现数据图表
2017/07/29 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
土木工程实习生自我鉴定
2013/09/19 职场文书
外贸业务员岗位职责
2013/11/24 职场文书
班组长岗位职责范本
2014/01/05 职场文书
八项规定整改方案
2014/02/21 职场文书
优秀学生评语大全
2014/04/25 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
工程部岗位职责范本
2015/04/11 职场文书
校车安全管理责任书
2015/05/11 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书