名前解決は、以下の規則に基づいて行います。
C::D::e()
をコールすると、それが
A::B::C::D::e()
に変換されます。
new C()
が new A::B::C()
に変換されます。
new C()
のコールは、次のように解決されます。
new ::C()
とする必要があります。
new A::B::C()
は、名前空間
A::B のクラス C を指します。
例1 名前解決の解説
<?php
namespace A;
// 関数コール
foo(); // まずは名前空間 "A" の関数 "foo" のコールを試み、
// それがなければ内部関数 "foo" をコールします
::foo(); // グローバルスコープで定義されている関数 "foo" をコールします
// クラスの参照
new B(); // まずは名前空間 "A" で定義されているクラス "B" のオブジェクトの作成を試み、
// それがなければ内部クラス "B" のオブジェクトを作成します
new ::B(); // グローバルスコープで定義されているクラス "B" のオブジェクトをします
// 他の名前空間の静的メソッド/関数
B::foo(); // まずは名前空間 "A::B" の関数 "foo" のコールを試み、
// 次に内部クラス "B" のメソッド "foo" をコールします
::B::foo(); // まずは名前空間 "B" の関数 "foo" のコールを試み、
// 次にグローバルスコープのクラス "B" のメソッド "foo" をコールします
// 現在の名前空間の静的メソッド/関数
A::foo(); // まずは名前空間 "A::A" の関数 "foo" のコールを試み、
// 次に名前空間 "A" のクラス "A" のメソッド "foo"、
// それから名前空間 "A" の関数 "foo"、
// さらにその次に内部クラス "A" のメソッド "foo" という順になります
::A::foo(); // まずは名前空間 "A" の関数 "foo" のコールを試み、次に
// グローバルスコープのクラス "A" のメソッド "foo" をコールします
?>