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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
教大家制作简单的php日历
Nov 17 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
php微信公众平台开发(三)订阅事件处理
Dec 06 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 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环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
php使用正则验证中文
2016/04/06 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
修复IE9&safari 的sort方法
2011/10/21 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
JS实现图片剪裁并预览效果
2016/08/12 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
详解jQuery事件
2017/01/13 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python实现图片处理和特征提取详解
2017/11/13 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
国家助学金获奖感言
2014/01/31 职场文书
消防应急演练方案
2014/02/12 职场文书
出生证明范本
2015/06/15 职场文书
同学聚会开幕词
2019/04/02 职场文书
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL