この記事の内容は、PHP 遅延バインディングです。必要な友達はこの記事も参照してください
PHP 5.3.0 以降、PHP には という機能が追加されています。遅延静的バインディング。継承スコープ内で静的に呼び出されるクラスを参照するために使用されます。
演算子); 非静的メソッド呼び出しを行う場合、それはオブジェクトが属するクラスです。いわゆる「転送電話」(転送CLASS) call) は、次のメソッドによる静的呼び出しを指します: self::、parent::、static::、および
forward_static_call()。 get_called_class() 関数を使用して、呼び出されたメソッドのクラス名 static:: を取得できますとその範囲を指摘している。
この機能は、言語内部の観点から「遅延静的バインディング」と呼ばれています。 「遅延バインディング」とは、静的::
を意味します。 現在のメソッドが定義されているクラスに解析されることはなくなりますが、実際の実行時に計算されます。静的メソッドの呼び出し (ただし、それに限定されない) に使用できるため、「静的バインディング」とも呼ばれます。
self現在のメソッドが定義されているクラスに応じて、self:: または
例 #1 self::Usage
<?phpclass 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(); //输出A?>static後期静的バインディング
後期静的バインディングの使用は、実行時に最初に呼び出されるクラスを表す新しいキーワードを導入することで制限を回避することを目的としていました。簡単に言うと、このキーワードを使用すると、上記の例で test() を呼び出すときに、クラス A の代わりにクラス B を参照できるようになります。最終的には、新しいキーワードを導入せず、すでに予約されている静的キーワードを使用することが決定されました。
<?phpclass 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(); //输出B?>
注:
非静的環境では static::注:rreee
を使用すると、次のように出力されます:
success! 致命的なエラー: /tmp/test.php の 9 行目でコンテキスト 'A' からプライベート メソッド C::foo() を呼び出します
遅延静的バインディングの解決は、完全に解決された静的呼び出しが取得されるまで続行されます。一方、parent:: または self:: を使用して静的に呼び出された場合は、呼び出し情報が転送されます。 呼び出しの転送と非転送A C C<?phpclass 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?>
上記のルーチンは出力します:
PHP の遅延バインディングの問題について考えるPHP の遅延バインディング
以上がPHPの遅延バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。