PHPで名前空間を使用する方法、パート1:基本

画像



序文:PHPの名前空間に関するいくつかの記事が既にHabrで公開されています(アプリケーション内でそれらへのすべてのリンクを提供します)。 しかし、この興味深く有用な質問は完全には明らかにされていません。 したがって、このトピックに関する3つの記事の最初の翻訳を引用します(残りは近い将来翻訳されます)。 PS初心者向け記事



名前空間は、PHP 5.3で最も重要な変更の1つです。 彼らはC#とJava開発者に馴染みがあり、おそらくPHPアプリケーションの構造をより良く変えるでしょう。



なぜ名前空間が必要なのですか?



PHPコードライブラリのサイズが大きくなると、以前に宣言された関数またはクラス名を誤ってオーバーライドするリスクも大きくなります。 サードパーティのコンポーネントまたはプラグインを追加しようとすると、問題はさらに悪化します。 複数のコードセットがデータベースクラスまたはユーザークラスを実行するとどうなりますか?



以前は、唯一の解決策は長いクラス/関数名でした。 たとえば、WordPressは各名前に接頭辞「WP_」を追加しました。 Zend Frameworkは通常、詳細に名前を付け、Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitiveなどの長いクラス名を導きます。



名前の一致の問題は、名前空間を導入することで解決されます。 PHPの定数、クラス、および関数は、名前空間ライブラリにグループ化できます。



名前空間はどのように定義されますか?



デフォルトでは、すべての定数、クラス、および関数名はグローバルスペースに配置されます-PHPが名前空間をサポートし始める前と同じです。



コードでは、名前空間は、PHPファイルの先頭にある単一の単語の名前空間を使用して定義されます。 この単語最初のコマンド( declareを除く)でなければならず、非PHPコード、HTML、スペースのいずれもこのコマンドの前に置かないでください。次に例を示します。

<?php // define this code in the MyProject namespace namespace MyProject;
      
      





これらの行に続くすべてのコードは、ネームスペース「MyProject」を参照します。 他の名前空間を埋め込むことや、コードの同じ部分に複数の名前空間を定義することは不可能です(最後の名前空間宣言のみが認識されるため、前のものは無視されます)。 ただし、同じファイルに異なる名前空間を定義できます。たとえば、次のとおりです。

 <?php namespace MyProject1; // PHP code for the MyProject1 namespace namespace MyProject2; // PHP code for the MyProject2 namespace // Alternative syntax namespace MyProject3 { // PHP code for the MyProject3 namespace } ?>
      
      





しかし、これは可能ですが、そうすることはお勧めしません。各ファイルに1つの名前空間のみを定義する場合は慎重に行ってください。



サブ名前空間


PHPでは、名前空間の階層を定義して、ライブラリを互いに従属させることができます。 結果の名前空間は、バックスラッシュ\を使用して区切られます。たとえば、次のとおりです。



ネームスペース関連コードの呼び出し



lib1.phpという名前のファイルで、名前空間App \ Lib1内に定数、関数、およびクラスを定義します。



lib1.php


 <?php // application library 1 namespace App\Lib1; const MYCONST = 'App\Lib1\MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } ?>
      
      





次のように、このコードを別のPHPファイルに含めることができます。



myapp.php


 <?php header('Content-type: text/plain'); require_once('lib1.php'); echo \App\Lib1\MYCONST . "\n"; echo \App\Lib1\MyFunction() . "\n"; echo \App\Lib1\MyClass::WhoAmI() . "\n"; ?>
      
      





myapp.phpファイルには名前空間が定義されていないため、コードはグローバルスペースに存在します。 MYCONSTMyFunction、またはMyClassへの直接参照は、 App \ Lib1名前空間にのみ存在するため失敗しますlib1.phpからコードを呼び出すには、プレフィックス\ App \ Lib1を追加して完全修飾名を決定します。 出力でmyapp.phpをロードすると、次の結果が得られます。

 App\Lib1\MYCONST App\Lib1\MyFunction App\Lib1\MyClass::WhoAmI
      
      





完全修飾名は非常に長くなる可能性があります。 ただし、 App-Lib1-MyClassなどの長いクラス名を定義することには、いくつかの明らかな利点があります。 したがって、次の記事では、エイリアスの使用について説明し、PHPが名前空間名を解決する方法を確認します。



また読む:



PHPで名前空間を使用する方法、パート2:インポート、エイリアス、解析ルール

PHPで名前空間を使用する方法、パート3:キーワードと起動



注:



A /Habréのトピックに関する唯一の詳細な記事:



記事には参照もあります。



B /メモ、修正、不正確さの表示など - ようこそ



All Articles