0

この遅い静的バインディングがどのように機能するかわかりません。

abstract class A{

  final public static function doprint(){
    print get_called_class() . '<br>';
  }


  public static function wrapper(){
    self::doprint();
    static::doprint();
  }

}

class A2 extends A{}    

A2::wrapper();

get_called_class() は、doprint メソッドを self で呼び出した場合でも、どちらの場合も A2 を出力します。なぜ?

4

2 に答える 2

1

get_called_class()どのクラスが呼び出されたかを示していると思いますが、その出力は正しいです。

レイト スタティック バインディングでは、selfコンテキストがバブルアップするため、より上位に定義されたメソッドは、呼び出されたメソッドのオブジェクトを操作できます。

于 2012-10-22T00:20:29.817 に答える
1

get_called_class()は常に、実際に呼び出したクラスを返します。A2::を呼び出すので、A2 です。

私のサイトには、 LSB シングルトン抽象クラスのチュートリアルがあります。私はここにリンクしていません. しかし、それは私の説明にあります。

LSB の問題は、A のメソッドが A のメソッドを呼び出すことができる B のメソッドを呼び出すことができることです。次の例を参照してください。

header('Content-Type: text/plain'); // Pretty text output
// LSB Parent
class A {
    // NOLSB: Will call Current Class method
    static public function TriggerSelf() {
        self::OverrideMe();
    }
    // LSB: Will call Inheriting Class method (or Current if none Inherits)
    static public function TriggerStatic() {
        static::OverrideMe();
    }
    // Method to Override
    static public function OverrideMe() {
        echo 'A here', PHP_EOL;
    }
}

// LSB Child
class B extends A {
    // Override by LSB
    static public function OverrideMe() {
        echo 'B here', PHP_EOL;
    }
}

A::TriggerSelf(); // <- NO LSB
A::TriggerStatic(); // <- LSB (but not inheritance)

B::TriggerSelf(); // <- NO LSB
B::TriggerStatic(); // <- LSB (with inheritance, so it works)

B:: TriggerStatic ()によって A が B メソッドを呼び出し、B ::TriggerSelf()が A メソッドを呼び出す方法をご覧ください。それがLSBです。親クラスの静的メソッドは、子クラスの静的メソッドを呼び出すことができます。それはかなり静的な抽象です:)

例を調べてください、それは理にかなっています。

于 2012-10-22T00:29:48.340 に答える