找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 741|回复: 0
打印 上一主题 下一主题

PHP5多态性与动态绑定介绍

[复制链接]

2487

主题

2487

帖子

7391

积分

论坛元老

Rank: 8Rank: 8

积分
7391
跳转到指定楼层
楼主
发表于 2018-2-14 05:47:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

            什么是多态性?
多态性是继数据抽象和继承后,面向对象语言的第三个特征。从字面上理解,多态的意思是“多种形态”,简单来说,多态是具有表现多种形态的能力的特征,在OO中是指“语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式”的能力。多态被认为是面向对象语言的必备特性。
例如:
我们创建一个接口 Shape,定义一个空的方法 draw(),那么所有的实现类都必须实现这个方法,假设 Shape 有两个实现类:Triangle 和 Rectangle,我们虽然无法通过类似这样的 Java 代码来诠释 PHP 的多态性:
[U]复制代码[/U] 代码如下:
Shape s = new Triangle();
s.draw();
不过 PHP5.1 中引入了 Type Hinting,可以限制函数(或者方法)的参数类型,我们使用这个特性来演示 PHP5 的多态性。
参考如下的代码:
[U]复制代码[/U] 代码如下:
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 也可以是一个抽象基类或者是非抽象的基类,上面的论述都是成立的。区别在于接口仅定义一套实现类必须遵守的规则,而使用基类则可以为派生类提供一些缺省的行为。
参考代码如下:
[U]复制代码[/U] 代码如下:
/**
* 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学习笔记 面向对象中[接口]与[多态性]的应用
  • 理解和运用PHP中的多态性[译]
  • PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
  • PHP5中实现多态的两种方法实例分享
  • 实例讲解PHP面向对象之多态
  • PHP多态代码实例
  • PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
  • php 三大特点:封装,继承,多态
  • PHP面向对象多态性实现方法简单示例
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端