4
<?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

谁能评估一下该输出是如何产生的?

4

1 回答 1

8

test() "A" 中第一行的结果没有利用后期静态绑定,因为在所有情况下,您都是直接调用类 "A" 的 foo 实现(技术上它是 LSB,但静态绑定到 A)。第二行和第三行展示了使用 static 关键字的预期行为,继承链无关紧要,static 指的是被调用的类。因此,即使您从 B 调用 parent::foo(),该实现也使用 LSB,其中 static 关键字解析为被调用的类,即 C。self::foo() 也是如此。

于 2012-06-17T15:25:52.760 回答