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 七大优势分析
Jun 23 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
php封装的pdo数据库操作工具类与用法示例
May 08 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
laravel框架模型、视图与控制器简单操作示例
Oct 10 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
一个好用的分页函数
2006/11/16 PHP
php 过滤器实现代码
2010/08/09 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
pycharm 使用心得(三)Hello world!
2014/06/05 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python获取地震信息 微信实时推送
2019/06/18 Python
Python求离散序列导数的示例
2019/07/10 Python
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
人力资源部培训专员岗位职责
2014/01/02 职场文书
高二化学教学反思
2014/01/30 职场文书
心理健康活动总结
2014/04/30 职场文书
奶茶店创业计划书
2014/08/14 职场文书
烟台的海导游词
2015/02/02 职场文书
培根随笔读书笔记
2015/07/01 职场文书
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL