後期静的バインディングについて
後期静的バインディングについて PHP のマニュアルを読みましたが、元のアドレスは http://cn2.php.net/manual/zh/ language.oop5.late です。 -static-bindings.php
4番目の例
<br />
<?php<br />
class A {<br />
public static function foo() {<br />
static::who();<br />
}<br />
<br />
public static function who() {<br />
echo __CLASS__."\n";<br />
}<br />
}<br />
<br />
class B extends A {<br />
public static function test() {<br />
A::foo();<br />
parent::foo();<br />
self::foo();<br />
}<br />
<br />
public static function who() {<br />
echo __CLASS__."\n";<br />
}<br />
}<br />
class C extends B {<br />
public static function who() {<br />
echo __CLASS__."\n";<br />
}<br />
}<br />
<br />
C::test();<br />
?><br />
ログイン後にコピー
結果は次のようになります:
あ
ち
ち
parent::foo() と self::foo() が呼び出されるときにクラス C の who() が呼び出されるのはなぜですか?
誰か友達がそれを説明してもらえますか、ありがとう。
-----解決策--------------------------------静的演算子の説明:
遅延静的バインディングは、ランタイムによって最初に呼び出されたクラスを表すキーワードを導入することで制限を回避しようとします。
最初に呼び出されるクラスは C
です
A::foo(); クラス A のメソッドを呼び出します。これは理解できます
self::foo(); // この self は実際には C クラスです。わかりますか? C::test() C は B の test() メソッドを継承します
parent::foo(); // self::who() の代わりに static::who(); が原因です。このメソッドによって呼び出される現在のクラスは、クラス C
の foo() メソッドです。
おそらく、C の who() メソッドがクラス A で呼び出されない理由がまだ理解できないかもしれません。これは、親の特別な関係によるものです。遅延静的バインディングは、特にサブクラスと親クラスの間で継承されたメソッドの問題を解決するために登場しました。
------解決策----------------------マニュアルには非常に明確に記載されています
-------------------------------------------------- ----
「遅延バインディング」とは、static:: が現在のメソッドが定義されているクラス
に解析されなくなり、実際の実行時に計算されることを意味します。静的メソッドの呼び出し (ただし、それに限定されない) に使用できるため、「静的バインディング」とも呼ばれます。
-------------------------------------------------- -----
#1 が指摘した小さな問題があります
self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法
ログイン後にコピー
不正確です。self はクラス B のままですが、foo メソッドをオーバーライドしないため、親クラス A の foo メソッドを呼び出します。
self が実際にクラス C の場合は、self::foo(); を self::who(); に変更してみてください。そうすると C が表示されるはずですが、B が表示されます。これが self と static の違いです。