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面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
php Memcache 中实现消息队列
Nov 24 PHP
PHP5中使用DOM控制XML实现代码
May 07 PHP
php 验证码实例代码
Jun 01 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
May 07 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
php 基础函数
Feb 10 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 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
各种战术和打法的原创者
2020/03/04 星际争霸
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue3.0 上手体验
2020/09/21 Javascript
python爬虫常用的模块分析
2014/08/29 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
python实现的Iou与Giou代码
2020/01/18 Python
jupyter实现重新加载模块
2020/04/16 Python
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
医学毕业生自荐信
2013/10/11 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
电工工作职责范本
2014/02/22 职场文书
《识字五》教学反思
2014/03/01 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
Python中time与datetime模块使用方法详解
2022/03/31 Python