PHPの遅延静的バインディング(パートI)

php 後の Late Static Binding(LSB)は、PHP開発者コミュニティでの過去3年間のホットな議論でした(そして、ついにPHP 5.3で取り上げられました)。 しかし、なぜそれが必要なのでしょうか? この記事では、静的リンクの遅延によってコードが大幅に簡素化れることを検証します。



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:実際的な例



All Articles