名前空間の使用方法について説明する前に、PHP がどの名前空間要素を使用するかをどのように認識するかを理解する必要があります。 PHP 名前空間とファイル システムの間で簡単に類推できます。ファイル システム内のファイルにアクセスするには、次の 3 つの方法があります:
foo.txt などの相対ファイル名形式。これは currentdirectory/foo.txt として解析されます。ここで、currentdirectory は現在のディレクトリを表します。したがって、現在のディレクトリが /home/foo の場合、ファイル名は /home/foo/foo.txt に解決されます。
相対パス名の形式は、subdirectory/foo.txtなどです。これは currentdirectory/subdirectory/foo.txt として解析されます。
絶対パス名は/main/foo.txtの形式です。これは /main/foo.txt として解析されます。
PHP 名前空間の要素も同じ原則を使用します。たとえば、クラス名は 3 つの方法で参照できます:
非修飾名、または $a=new foo(); や foo::staticmethod(); などのプレフィックスを含まないクラス名。現在の名前空間が currentnamespace の場合、foo は currentnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、どの名前空間にもコードが含まれていない場合、foo は foo として解決されます。警告: ネームスペース内の関数または定数が未定義の場合、修飾されていない関数または定数名はグローバル関数または定数名に解決されます。
修飾名、または $a = new subnamespacefoo(); や subnamespacefoo::staticmethod(); などの接頭辞を含む名前。現在の名前空間が currentnamespace の場合、foo は currentnamespacesubnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、コードがどの名前空間にも含まれていない場合、foo はサブ名前空間 foo に解決されます。
完全修飾名、またはグローバル接頭辞演算子を含む名前 ($a = new currentnamespacefoo(); または currentnamespacefoo::staticmethod(); など)。この場合、foo はコード内で常にリテラル名 currentnamespacefoo に解決されます。
以下はこれら 3 つのメソッドの使用例です:
file1.php:
<?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { static function staticmethod() {} } ?>
file2.php:
<?php namespace Foo\Bar; include 'file1.php'; const FOO = 2; function foo() {} class foo { static function staticmethod() {} } /* 非限定名称 */ foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。 echo FOO; // resolves to constant Foo\Bar\FOO /* 限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,以及类的方法 staticmethod echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO /* 完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO ?>
グローバル クラス、関数、または定数にアクセスするには、次のような完全修飾名を使用できることに注意してください。 strlen() または例外または INI_ALL として。
例 #1 名前空間内のグローバル クラス、関数、定数にアクセスする
<?php namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = \strlen('hi'); // 调用全局函数strlen $b = \INI_ALL; // 访问全局常量 INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception ?>