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框架的性能
Jan 10 PHP
PHP注释实例技巧
Oct 03 PHP
php smarty的预保留变量总结
Dec 04 PHP
PHP中使用gettext来支持多语言的方法
May 02 PHP
php筛选不存在的图片资源
Apr 28 PHP
PHP实现仿Google分页效果的分页函数
Jul 29 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
php中序列化与反序列化详解
Feb 13 PHP
php 7新特性之类型申明详解
Jun 06 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 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
新闻分类录入、显示系统
2006/10/09 PHP
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
精通Javascript系列之数值计算
2011/06/07 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
Django+Vue跨域环境配置详解
2018/07/06 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
中学教师岗位职责
2013/11/26 职场文书
校园创业策划书
2014/01/14 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
老师对学生的评语
2014/04/18 职场文书
消防安全承诺书
2014/05/22 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
六五普法宣传标语
2014/10/06 职场文书
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
MySQL 如何限制一张表的记录数
2021/09/14 MySQL
SQL Server使用导出向导功能
2022/04/08 SQL Server