マニュアルの原文: PHP 5.3.0 以降、PHP には遅延静的バインディングと呼ばれる機能が追加され、 は継承スコープ内で静的に呼び出されるクラスを参照するために使用されます。
後期静的バインディングの動作原理は、前の「非転送呼び出し」にクラス名を保存することです。静的メソッド呼び出しを行う場合、クラス名は明示的に指定されたもの (通常は :: 演算子の左側) であり、非静的メソッド呼び出しを行う場合は、オブジェクトが属するクラスです。いわゆる「転送呼び出し」とは、self::、parent::、static::、および forward_static_call() の方法で行われる静的呼び出しを指します。 get_called_class() 関数を使用すると、呼び出されたメソッドのクラス名を取得でき、static:: はそのスコープを示します。
この機能は、言語内部の観点から「遅延静的バインディング」と呼ばれています。 「遅延バインディング」とは、static:: が現在のメソッドが定義されているクラスに解決されず、実際の実行時に計算されることを意味します。静的メソッドの呼び出し (ただし、それに限定されない) に使用できるため、「静的バインディング」とも呼ばれます。
self:: の制限 現在のメソッドが定義されているクラスに応じて、現在のクラスへの静的参照には self:: または __CLASS__ を使用します。
例 #1 self:: 使用法<?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
上記のルーチンは出力します:
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
上記のルーチンは次の出力を行います:
<?php class A { private function foo() { echo "success!\n"; } public function test() { $this->foo(); static::foo(); } } class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */ } class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ } } $b = new B(); $b->test(); $c = new C(); $c->test(); //fails ?>
の使用 上記のルーチンは出力します:
success!
success! 致命的なエラー: コンテキスト 'A' からのプライベート メソッド C::foo() の呼び出し/tmp/test.php の 9 行目
注: 後期静的バインディングの解析は、完全に解析された静的呼び出しが取得されるまで続行されます。一方、parent:: または self:: を使用して静的に呼び出された場合は、呼び出し情報が転送されます。
<?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(); ?>
上記のルーチンは出力します:
C
C
次の例は、PHP の遅延に基づいて、継承スコープ内の静的呼び出しを参照するソリューションを分析します。静的バインディング関数のタイプ。
class Person { public static function status() { self::getStatus(); } protected static function getStatus() { echo "Person is alive"; } } class Deceased extends Person { protected static function getStatus() { echo "Person is deceased"; } } Deceased::status(); //Person is alive
明らかに、結果は私たちが期待したものではありません。これは、self:: が実行中のクラスではなく、定義されているクラスに依存しているためです。この問題を解決するには、継承されたクラスの status() メソッドをオーバーライドすることができます。より良い解決策は、PHP 5.3 に遅延静的バインディングの機能を追加することです。
class Person { public static function status() { static::getStatus(); } protected static function getStatus() { echo "Person is alive"; } } class Deceased extends Person { protected static function getStatus() { echo "Person is deceased"; } } Deceased::status(); //Person is deceased
static:: が現在のクラスを指していないことがわかります。実際、実行時に計算され、最終クラスのすべてのプロパティが強制的に取得されます。
を使用することをお勧めします。
以上がPHPポストスタティックバインディングの定義と使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。