このバージョンの最も顕著な特徴の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:名前空間について知っておくべきこと