PHP 名前空間解決ルール
名前空間名の定義
非修飾名未修飾名
<code>名称中不包含命名空间分隔符的标识符,例如Foo </code>
修飾名修飾名
<code>名称中含有命名空间分隔符的标识符,例如:Foo\Bar </code>
完全修飾名
<code>名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如:\Foo\Bar. namespace\Foo 也是一个完全限定名称。 </code>
名前解決は次の規則に従います
名前空間 (AB など) 内の非修飾名または修飾名クラス (非完全修飾名) への呼び出しは、実行時に解決されます。以下は、new C() と new DE() を呼び出す解析プロセスです:
new C() の解析:
現在の名前空間でクラス ABC を検索します。
クラス ABC を自動的にロードしてみます。
新しい DE() 分析:
クラス名の前に現在の名前空間名を追加して ABDE となり、クラスを見つけます
クラス ABDE を自動的にロードしてみます。
グローバル名前空間内のグローバル クラスを参照するには、完全修飾名 new C() を使用する必要があります。
名前解決の例
<code><?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" // 调用另一个命名空间中的<strong>静态方法</strong>或命名空间函数 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" // 当前命名空间中的<strong>静态方法</strong>或函数 A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B" \A\B::foo(); // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B" ?> </code>
上記では、静的メソッドを含む PHP 名前空間解析ルールを紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。