PHP 5.3の関数オーバーライド

PHP 5.3はもはやニュースではなく、きちんと書かれています(バージョン5.4のリリース後、なんとなく退屈になりました)。 それでも、その機能の1つを強調したいと思います。



このバージョンの最も顕著な特徴の1つは、名前空間のサポートです。これは、PHPのプログラミングパラダイムの変更を伴いました。 したがって、多くの著名なフレームワークが、新しい方法でコードを書き直し始めました。 この記事は、これがすべてにつながったものについてです。





小さな例*:



\\index.php namespace Zend\Date { function is_object($date) { echo "Zend Date constructor is called with param {$date}";exit; } } namespace Foo { require_once 'zf2/library/Zend/Loader/AutoloaderFactory.php'; \Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array())); $date = new \Zend\Date\Date('2012-03-18'); }
      
      







ここで何が起こっていますか? \ Zend \ Date \ Dateコンストラクターの最初に呼び出されるis_object関数を再定義しました。 値が参照によって渡されるように関数の定義を変更すると、結果だけでなく、関数に渡されるパラメーター自体も変更できます。



デフォルトでは、phpは宣言された名前空間で関数を検索し、存在しない場合にのみグローバル名前空間での検索に進むため、このコードは機能します。 そして、同じ名前の名前空間をいつでもどこでもアナウンスできます。 ところで、定数と同じ話。



この機能は、非常に優れたデバッグおよびテスト機能(さようならrunkit)を提供しますが、アプリケーションのセキュリティに大きな穴を開けます。



この機能がコードの問題であると思われる場合は、バックスラッシュ(\)を関数(定数)呼び出しに追加するだけで回避できます。 その後、PHPは直ちにグローバル名前空間で定義を探します。



結論として、現時点では、Zend、Symfony、Doctrineでそのようなことができると言いたいと思います。



*-インタープリターバージョン5.4.0RC9-dev



UPD: FAQ:名前空間について知っておくべきこと



All Articles