Aveneu Park, Starling, Australia

PHP后期静态绑定

从PHP5.3开始,PHP增加后期静态绑定功能, 用于在继承范围内引用静态调用的类,即在类的继承过程中,使用的类不再是当前类,而是调用的类。后期静态绑定使用关键字static来实现,通过这种机制,“static::”不再被解析为定义当前方法所在的类,而是在实际运行时计算得到的,即为运行时最初调用的类。虽然将其称之为“后期静态绑定”,但它不仅限制于静态方法的调用。下面介绍一个具体实例。

<?php
class A {
    public static function call() {
        echo "class A\n";
    }
    public static function test(){
        self::call();
        static::call();
    }
}
class B extends A {
    public static function call() {
        echo "class B\n";
    }
}

B::test();

输出:

class A
class B

通过上述实例可以看出,在调用test()函数时,self:: 是直接调用本类中的方法,而static是根据调用test()函数的类来决定static::的值,因此static的值只有在调用时才能确定下来,而self则是在定义时就确定下来的。需要注意的是,static并不限于静态方法调用,同样适用于非静态函数的调用,调用的方式同上述静态函数一样,是在调用时动态确定的。下面给出非静态方法调用的实例。

<?php
class A {
    public function call() {
        echo "instance from A\n";
    }
    public function test()
    {
        self::call();
        static::call();
    }
}

class B extends A {
    public function call() {
        echo "instance from B\n";
    }
}
$b = new B();
$b->test();

输出:instance from A
instance from B

后期静态绑定还可以用于对象实例化中,同上述内容一样,在实例化对象时,static会根据运行时调用的类来决定实例化对象,而self是根据所在位置的类来决定实例化对象,下面给出一个具体实例

<?php
class A {
    public static function create() {
        $self = new self();
        $static = new static();
        return array($self, $static);
    }
}
class B extends  A {}

$arr = B::create();
foreach($arr as $val) {
    var_dump($val);
}
输出
E:\project\php\study\static3.php:13:
class A#1 (0) {
}
E:\project\php\study\static3.php:13:
class B#2 (0) {
}

发表评论