
2005年11月にパリで開催されたPHP開発者会議で、後期静的バインディングのトピックがコア開発チームによって公式に議論されました。 彼らは、議題にあった他の多くのトピックとともに、それを実装することに同意しました。 詳細は公開討議で合意されているはずです。
最新の静的バインディングがトークンとして発表されてから2年が経過しました。 そして最後に、LSBはPHP 5.3で使用できるようになりました。 しかし、このイベントはPHPを使用する開発者に気付かれずに渡されました。注意事項から、マニュアルにはページが1つしかありません。
つまり、新しい遅延静的バインディング機能により、オブジェクトは引き続き親クラスからメソッドを継承できますが、これに加えて、従来のメソッドは親クラスだけでなく、子孫クラスの静的定数、メソッド、およびプロパティにアクセスできます。 例を見てみましょう:
クラスBeer { const NAME = 'Beer!'; パブリック関数getName(){ return self :: NAME; } } クラスAle extends Beer { const NAME = 'エール!'; } $ beerDrink =新しいビール; $ aleDrink = new Ale; echo "Beer is:"。 $ beerDrink-> getName()。 "\ n"; echo "Ale is:"。 $ aleDrink-> getName()。 "\ n";
このコードは次の結果を生成します。
ビールは:ビール! エール:ビール!
AleクラスはgetName()メソッドを継承しましたが、 selfはそれが使用されるクラス(この場合はBeerクラス)を引き続き指します。 これはPHP 5.3に残りましたが、 静的という単語が追加されました。 また、例を考えてみましょう。
クラスBeer { const NAME = 'Beer!'; パブリック関数getName(){ return self :: NAME; } パブリック関数getStaticName(){ return static :: NAME; } } クラスAle extends Beer { const NAME = 'エール!'; } $ beerDrink =新しいビール; $ aleDrink = new Ale; echo "Beer is:"。 $ beerDrink-> getName()。 "\ n"; echo "Ale is:"。 $ aleDrink-> getName()。 "\ n"; echo "ビールは実際には:"です。 $ beerDrink-> getStaticName()。 "\ n"; echo「エールは実際には:」。 $ aleDrink-> getStaticName()。 "\ n";
新しい静的キーワードは、 getStaticName()メソッドが宣言されているクラスで定義された定数ではなく、継承されたクラスの定数を使用する必要があることを示します。 静的という言葉は、新しい機能を実装するために追加されたものであり、下位互換性のために、以前のバージョンのPHPと同じように機能します。
内部的に、これら2つのアクセス方法の主な違い(そして実際、バインディングが遅れて呼び出された理由)は、PHPがself:NAMEの値を決定することです。 静的:: NAMEの場合、値は起動時に決定されます(Zendエンジンでマシンコードが実行される瞬間)。
これは、PHP開発者向けの別のツールです。 第二部では、それがどのように善のために使われるかを考えます。
更新: 記事の2番目の部分。 実用的な例。
VIA: PHPの遅延静的バインディング(パートI)
これの翻訳: Late Static Binding:実際的な例