后期静态绑定中的转发和非转发调用(PHP 5.3)

时间:2012-06-17 15:08:02

标签: php-5.3

<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
?> 

以下是输出:

A
C
C

任何人都可以评估一下这个输出是如何产生的吗?

1 个答案:

答案 0 :(得分:7)

test()“A”中第一行的结果不利用Late Static Binding,因为在所有情况下,你直接调用类“A”的foo实现(技术上它是LSB,但是static被绑定到A)。第二行和第三行用static关键字证明了预期的行为,继承链无所谓,static指的是被调用的类。因此,即使您从B调用parent :: foo(),该实现也使用LSB,其中static关键字解析为被调用的类,即C语言。对于self :: foo()也是如此。