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提取数据库内容中的图片地址并循环输出
Mar 21 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
Laravel5中contracts详解
Mar 02 PHP
PHP实现懒加载的方法
Mar 07 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 PHP
php实现分页功能的详细实例方法
Sep 29 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 23 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
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
Python中subprocess模块用法实例详解
2015/05/20 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
Python基础知识点 初识Python.md
2019/05/14 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
单位实习鉴定评语
2015/01/04 职场文书
劳资员岗位职责
2015/02/13 职场文书
古诗之感恩老师
2019/10/24 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
基于Go语言构建RESTful API服务
2021/07/25 Golang
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python