(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" のコールを試み、