在討論如何使用命名空間之前,必須瞭解 PHP 是如何知道要使用哪一個命名空間中的元素的。可以將 PHP 命名空間與檔案系統作一個簡單的類比。在檔案系統中訪問一個檔案有三種方式:
相對檔案名稱形式如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 命名空間中的元素使用同樣的原理。例如,類名可以通過三種方式引用:
非限定名稱,或不包含首碼的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。
限定名稱,或包含首碼的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,foo 會被解析為subnamespace\foo。
完全限定名稱,或包含了全域首碼操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo。
下面是一個使用這三種方式的執行個體:
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() 或 \Exception 或 \INI_ALL。
Example #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?>