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" の最初の行の結果は、Late Static Binding を利用していません。これは、すべての場合において、クラス "A" の foo の実装を直接呼び出しているためです (技術的には LSB ですが、static はバインドされています)。へ)。2 行目と 3 行目は static キーワードを使用した予想される動作を示しています。継承の連鎖は問題ではありません。static は呼び出されたクラスを参照します。したがって、B から parent::foo() を呼び出している場合でも、その実装では static キーワードが呼び出された classに解決される LSB を使用しました。これは C です。self::foo() でも同じことが起こります。

于 2012-06-17T15:25:52.760 に答える