名前解決ルール
名前解決ルールを説明する前に、いくつかの重要な定義を見てみましょう:
名前空間名の定義
非修飾名非修飾名
名前に名前空間区切り文字が含まれていない識別子(Fooなど)
修飾名修飾名
名前に名前空間区切り文字が含まれる識別子 (FooBar など)
完全修飾名
名前に名前空間区切り文字が含まれ、名前空間区切り文字で始まる識別子 (FooBar など)。 namespaceFoo も完全修飾名です。
名前解決は次のルールに従います:
完全修飾名を持つ関数、クラス、定数の呼び出しはコンパイル時に解決されます。たとえば、新しい AB はクラス AB に解決されます。
すべての非修飾名と修飾名 (非完全修飾名) は、現在のインポート ルールに従ってコンパイル時に変換されます。たとえば、名前空間 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 の自動ロードを試してください。
new DE() の解析:
クラス名の前に現在の名前空間名を追加して ABDE となり、クラスを検索します。
クラス ABDE の自動ロードを試してください。
グローバル名前空間内のグローバル クラスを参照するには、完全修飾名 new C() を使用する必要があります。
<?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" new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象 // 如果未找到,则尝试自动装载类 "B\D" new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象 // 如果未找到,则尝试自动装载类 "C\E" new \B(); // 创建定义在全局空间中的类 "B" 的一个对象 // 如果未发现,则尝试自动装载类 "B" new \D(); // 创建定义在全局空间中的类 "D" 的一个对象 // 如果未发现,则尝试自动装载类 "D" new \F(); // 创建定义在全局空间中的类 "F" 的一个对象 // 如果未发现,则尝试自动装载类 "F" // 调用另一个命名空间中的静态方法或命名空间函数 B\foo(); // 调用命名空间 "A\B" 中函数 "foo" B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法 // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B" D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法 // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D" \B\foo(); // 调用命名空间 "B" 中的函数 "foo" \B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法 // 如果类 "B" 未找到,则尝试自动装载类 "B" // 当前命名空间中的静态方法或函数 A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B" \A\B::foo(); // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B" ?>
上記は、Note 009 PHP Namespace - Part Two の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。