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 Squid中可缓存的动态网页设计
Sep 17 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &
Feb 09 PHP
php feof用来识别文件末尾字符的方法
Aug 01 PHP
基于php验证码函数的使用示例
May 03 PHP
PHP利用REFERER根居访问来地址进行页面跳转
Sep 28 PHP
分享一个php 的异常处理程序
Jun 22 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 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/04/09 国漫
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
javascript动态加载二
2012/08/22 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
javascript基本包装类型介绍
2015/04/10 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
详解Python命令行解析工具Argparse
2016/04/20 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Django实现简单的分页功能
2021/02/22 Python
园长自我鉴定
2013/10/06 职场文书
计算机网络专业个人的自我评价
2013/10/17 职场文书
物流司机岗位职责
2013/12/28 职场文书
元旦晚会策划方案
2014/02/18 职场文书
前台文员职责范本
2014/03/07 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
mysql事务对效率的影响分析总结
2021/10/24 MySQL
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS