1

私は遅い静的バインディングについて頭を悩ませようとしています.いくつかのスタックオーバーフローの質問とマニュアルを読むことで、私が見つけたすべての例(マニュアルを含む)で、メソッドクラス名を直接エコーするものは、子クラスで複製されます。

私の理解では、別のクラスから拡張されたクラスは、その親のすべてのメソッドとプロパティを継承します。したがって、PHP マニュアルの遅延静的バインディングの例で who() メソッドが重複しているのはなぜですか。それがないと、親クラスがエコーされることに気づきましたが、その理由はわかりません。

マニュアルのコードを参照してください...

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

who() メソッドを書き直す必要があるのはなぜですか。同じでなければならないと思いますか? 前もって感謝します。

4

1 に答える 1

3

Late static binding仮想メソッド呼び出しに似ていますが、静的です。

クラス A では、メソッド test が two() を呼び出します。two() は「A」を表示する必要があります。ただし、これは仮想メソッドに似ているため、B::two()代わりに実行されます。

これはほとんど同じコードですが、何が起こっているのかがより明確になっていると思います:

<?php
class A {
    public static function process() {
        echo "AAAA";
    }
    public static function test() {
        static::process(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function process() {
        echo "BBBB";
    }
}

B::test();

実行すると印刷BBBBされます。

于 2015-07-01T20:49:08.023 に答える