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函数常用用法小结
Feb 08 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
关于PHP语言构造器介绍
Jul 08 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
PHP中的日期加减方法示例
Aug 21 PHP
PHP网络操作函数汇总
May 18 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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 INI配置文件的解析实现分析
2011/01/04 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
python类继承用法实例分析
2015/05/27 Python
Golang与python线程详解及简单实例
2017/04/27 Python
详解python字节码
2018/02/07 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
自主招生自荐信指南
2014/02/04 职场文书
高中班主任评语大全
2014/04/25 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
毕业赠语大全
2015/06/23 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
Python OpenCV超详细讲解基本功能
2022/04/02 Python