名前空間の概要
PHP では、クラス ライブラリやアプリケーションを作成するときにクラスや関数などの再利用可能なコードを作成するときに発生する 2 種類の問題を解決するために名前空間が使用されます。
ユーザーが作成したコードと、PHP の内部クラス/関数/定数またはサードパーティのクラス/関数/定数の間で名前が競合します。 非常に長い識別子名 (通常、最初の種類の問題を軽減するために定義される) のエイリアス (または短い) 名を作成し、ソース コードの可読性を向上させます。
PHP 名前空間は、関連するクラス、関数、定数をグループ化する方法を提供します。以下は、PHP 名前空間構文を示す例です:
名前空間を定義する
任意の合法的な PHP コードを名前空間に含めることができますが、名前空間の影響を受けるコードはクラス、関数、定数の 3 種類のみです。名前空間は、キーワード namespace を使用して宣言されます。ファイルに名前空間が含まれている場合は、他のすべてのコードの前に名前空間を宣言する必要があります。さらに、PHP の他の言語機能とは異なり、同じ名前空間を複数のファイルで定義できるため、同じ名前空間の内容を別のファイルに分割して保存できます。もちろん、同じファイル内に複数の名前空間を定義することもできます。
PHP 名前空間での要素の使用
名前空間の使用方法について説明する前に、PHP がどの名前空間要素を使用するかをどのように認識するかを理解する必要があります。クラス名は 3 つの方法で参照できます:
修飾されていない名前、またはプレフィックスのないクラス名 ($a=new foo(); または foo::staticmethod(); など)。現在の名前空間が currentnamespace の場合、foo は currentnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、どの名前空間にもコードが含まれていない場合、foo は foo として解決されます。 警告: ネームスペース内の関数または定数が未定義の場合、修飾されていない関数または定数名はグローバル関数または定数名に解決されます。詳細については、「名前空間の使用: フォールバック グローバル関数名/定数名」を参照してください。
修飾名、またはプレフィックスを含む名前 ($a = new subnamespacefoo(); または subnamespacefoo::staticmethod(); など)。現在の名前空間が currentnamespace の場合、foo は currentnamespacesubnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、コードがどの名前空間にも含まれていない場合、foo はサブ名前空間 foo に解決されます。
完全修飾名、またはグローバル接頭辞演算子を含む名前 ($a = new currentnamespacefoo() または currentnamespacefoo::staticmethod(); など)。この場合、foo はコード内で常にリテラル名 currentnamespacefoo に解決されます。
名前空間を使用: alias/import
エイリアスを介して外部完全修飾名を参照またはインポートできるようにすることは、名前空間の重要な機能です。 PHP 名前空間のサポート エイリアスまたはインポートを使用するには、クラス名にエイリアスを使用する方法と、名前空間名にエイリアスを使用する方法の 2 つがあります。 PHP では、エイリアスは演算子を使用して実装されます。
PHP はインポートされた関数や定数をサポートしていないことに注意してください。
// 次の例は、NSname として MyFullNSname を使用するのと同じです
use MyFullNSname;
//グローバルクラスをインポートします
ArrayObjectを使用します;
名前解決ルール
名前解決ルールを説明する前に、いくつかの重要な定義を見てみましょう:
非修飾名: 名前に名前空間区切り文字を含まない識別子 (Foo など)
修飾名: 名前に名前空間区切り文字を含む識別子 (FooBar など)。 FooBar などの名前空間区切り文字を含み、名前空間区切り文字で始まるもの。 namespaceFoo も完全修飾名です。
名前解決は次のルールに従います:
すべての非修飾名と修飾名 (完全修飾名ではない) は、現在のインポート ルールに従ってコンパイル時に変換されます。たとえば、名前空間 ABC が C としてインポートされる場合、CDe() の呼び出しは ABCDe() に変換されます。
名前空間内で、インポート ルールに従って変換されないすべての修飾名には、現在の名前空間名が先頭に付加されます。たとえば、CDe() が名前空間 AB 内で呼び出された場合、CDe() は ABCDe() に変換されます。
修飾されていないクラス名は、現在のインポート ルールに従ってコンパイル時に変換されます (短いインポート名の代わりに完全な名前が使用されます)。たとえば、名前空間 ABC が C としてインポートされる場合、 new C() は new ABC() に変換されます。
名前空間 (AB など) 内では、修飾されていない名前への関数呼び出しは実行時に解決されます。たとえば、関数 foo() への呼び出しは次のように解析されます:
1) 現在の名前空間で ABfoo() という名前の関数を見つけます。
2) グローバル空間で関数 foo() を見つけて呼び出してみます。
名前空間 (AB など) 内の非修飾名または修飾名クラス (非完全修飾名) への呼び出しは実行時に解決されます。以下は、new C() と new DE() を呼び出す解析プロセスです: new C() の解析:
現在の名前空間で ABC クラスを見つけます。
クラス ABC の自動ロードを試してください。
クラス名の前に現在の名前空間名を追加して、ABDE となり、クラスを検索します。
クラスABDEの自動ロードを試してください。
名前解決の例