(PHP 5 >= 5.3.0, PHP 7, PHP 8)
名前解決のルールを説明するにあたって、いくつかの重要な定義を示しておきます。
これは名前空間区切り文字を含まない識別子で、Foo のようなものです。
これは名前空間区切り文字を含む識別子で、Foo\Bar のようなものです。
これは名前空間区切り文字を含む識別子のうち先頭が名前空間区切り文字で始まるもので、
\Foo\Bar のようなものです。名前空間 \Foo
も完全修飾名です。
namespace\Foo\Bar のように、
namespace で始まる識別子です。
名前解決は、これらの解決ルールによって行われます。
\A\B は A\B と解釈されます。
namespace という名前を、
現在の名前空間に置き換えたものに常に解決されます。
現在の名前空間がグローバル名前空間だった場合、
namespace\ 名前空間は取り除かれます。
たとえば、名前空間 X\Y の中にある
namespace\A は、
X\Y\A に解決されます。
グローバル名前空間の中にある同じ名前は、
A に解決されます。
A\B\C が
C としてインポートされた場合、
C\D\E という名前は、
A\B\C\D\E と翻訳されます。
A\B の中にある
C\D\E という名前は
A\B\C\D\E に解決されます。
use A\B\C; の後に、
new C() のようなことをすると、
C は A\B\C() に解決されます。
同じように、use function A\B\foo;
の後に foo() のようなことをすると、
A\B\foo という名前に解決されます。
A\B の内部にある
new C() は、
A\B\C という名前に解決されます。
A\B の中にあると仮定すると、
関数 foo() のコールは、次のように解決されます。
A\B\foo() を探します。
foo() を探します。
例1 名前解決の例
<?php
namespace A;
use B\D, C\E as F;
// 関数のコール
foo(); // まず名前空間 "A" で定義されている "foo" のコールを試み、
// 次にグローバル関数 "foo" をコールします
\foo(); // グローバルスコープで定義されている関数 "foo" をコールします
my\foo(); // 名前空間 "A\my" で定義されている関数 "foo" をコールします
F(); // まず名前空間 "A" で定義されている "F" のコールを試み、
// 次にグローバル関数 "F" をコールします
// クラスの参照
new B(); // 名前空間 "A" で定義されているクラス "B" のオブジェクトを作成します
// 見つからない場合は、クラス "A\B" の autoload を試みます
new D(); // インポートルールを使用し、名前空間 "B" で定義されているクラス "D" のオブジェクトを作成します
// 見つからない場合は、クラス "B\D" の autoload を試みます
new F(); // インポートルールを使用し、名前空間 "C" で定義されているクラス "E" のオブジェクトを作成します
// 見つからない場合は、クラス "C\E" の autoload を試みます
new \B(); // グローバルスコープで定義されているクラス "B" のオブジェクトを作成します
// 見つからない場合は、クラス "B" の autoload を試みます
new \D(); // グローバルスコープで定義されているクラス "D" のオブジェクトを作成します
// 見つからない場合は、クラス "D" の autoload を試みます
new \F(); // グローバルスコープで定義されているクラス "F" のオブジェクトを作成します
// 見つからない場合は、クラス "F" の autoload を試みます
// 別の名前空間から使用するstaticメソッド/関数
B\foo(); // 名前空間 "A\B" の関数 "foo" をコールします
B::foo(); // 名前空間 "A" で定義されているクラス "B" のメソッド "foo" をコールします
// クラス "A\B" が見つからない場合はクラス "A\B" の autoload を試みます
D::foo(); // インポートルールを使用し、名前空間 "B" で定義されているクラス "D" のメソッド "foo" をコールします
// クラス "B\D" が見つからない場合はクラス "B\D" の autoload を試みます
\B\foo(); // 名前空間 "B" の関数 "foo" をコールします
\B::foo(); // グローバルスコープのクラス "B" のメソッド "foo" をコールします
// クラス "B" が見つからない場合はクラス "B" の autoload を試みます
// 現在の名前空間から使用するstaticメソッド/関数
A\B::foo(); // 名前空間 "A\A" のクラス "B" のメソッド "foo" をコールします
// クラス "A\A\B" が見つからない場合はクラス "A\A\B" の autoload を試みます
\A\B::foo(); // 名前空間 "A" のクラス "B" のメソッド "foo" をコールします
// クラス "A\B" が見つからない場合はクラス "A\B" の autoload を試みます
?>