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 相关文章推荐
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
fgetcvs在linux的问题
Jan 15 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
php微信公众平台开发类实例
Apr 01 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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
escape unescape的php下的实现方法
2007/04/27 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JS作用域链详解
2017/06/26 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
在python的类中动态添加属性与生成对象
2016/09/17 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
"引用"与多态的关系
2013/02/01 面试题
金士达面试非笔试
2012/03/14 面试题
物流经理自我评价
2013/09/23 职场文书
平面设计岗位职责
2013/12/14 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
2015年老干部工作总结
2015/04/23 职场文书
孔子观后感
2015/06/08 职场文书
工作表现证明
2015/06/15 职场文书
小学总务工作总结
2015/08/13 职场文书
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js