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+DBM的同学录程序(2)
Oct 09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
PHP中使用file_get_contents post数据代码例子
Feb 13 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
PHP如何使用array_unshift()在数组开头插入元素
Sep 01 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
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
php检测文件编码的方法示例
2014/04/25 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python中enumerate函数用法实例分析
2015/05/20 Python
python简单猜数游戏实例
2015/07/09 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
幼儿园大班毕业感言
2014/02/06 职场文书
什么是就业协议书
2014/04/17 职场文书
优秀毕业生求职信
2014/06/05 职场文书
小型婚礼主持词
2015/06/30 职场文书
2019请假条的基本格式及范文!
2019/07/05 职场文书
创业计划书之餐饮
2019/09/02 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
服务器SVN搭建图文安装过程
2022/06/21 Servers