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应用程序来获取Web服务器的状态信息
Oct 09 PHP
session在PHP大型web应用中的使用
Jun 25 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
php实现的用户查询类实例
Jun 18 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 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
PHP函数常用用法小结
2010/02/08 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
初识NodeJS服务端开发入门(Express+MySQL)
2017/04/07 NodeJs
VUE中的无限循环代码解析
2017/09/22 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
联强国际笔试题面试题
2013/07/10 面试题
高校教师岗位职责
2014/03/18 职场文书
二年级评语大全
2014/04/23 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
大学生见习报告总结
2014/11/04 职场文书
2014年招商工作总结
2014/11/22 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
关于JavaScript轮播图的实现
2021/11/20 Javascript
Python OpenCV之常用滤波器使用详解
2022/04/07 Python
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL