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类
Apr 09 PHP
PHP下对字符串的递增运算代码
Aug 21 PHP
用PHP将数据导入到Foxmail的实现代码
Sep 05 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
phpquery中文手册
Mar 18 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
php cookie的操作实现代码(登录)
2010/12/29 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
Python建立Map写Excel表实例解析
2018/01/17 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
小学师德师风整改措施
2014/10/27 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python