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使用者状态管理功能的应用
Oct 09 PHP
php与paypal整合方法
Nov 28 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
PHP中实现crontab代码分享
Mar 26 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
Yii2框架实现注册和登录教程
Sep 30 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
基于PHP的微信公众号的开发流程详解
Aug 07 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
在JS中如何调用JSP中的变量
2014/01/22 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
浅谈Python中copy()方法的使用
2015/05/21 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
快速创建python 虚拟环境
2020/11/28 Python
do you have any Best Practice for testing
2016/06/04 面试题
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
写好自荐信的技巧
2013/11/08 职场文书
自我鉴定注意事项
2014/01/19 职场文书
股票投资建议书
2014/05/19 职场文书
语文课外活动总结
2014/08/27 职场文书
财务工作检讨书
2014/10/29 职场文书
迎新生晚会主持词
2015/06/30 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS