(PHP 5 >= 5.3.0, PHP 7, PHP 8)
在討論如何使用命名空間之前,必須了解 PHP 是如何知道要使用哪一個命名空間中的元素的??梢詫?PHP 命名空間與文件系統(tǒng)作一個簡單的類比。在文件系統(tǒng)中訪問一個文件有三種方式:
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
。
$a=new foo();
或
foo::staticmethod();
。如果當前命名空間是
currentnamespace
,foo 將被解析為
currentnamespace\foo
。如果使用 foo
的代碼是全局的,不包含在任何命名空間中的代碼,則 foo
會被解析為 foo
。
警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱或常量名稱會被解析為全局函數(shù)名稱或常量名稱。詳情參見
使用命名空間:后備全局函數(shù)名稱/常量名稱。
$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(); // 解析為函數(shù) Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo 的靜態(tài)方法 staticmethod
echo FOO; // 解析為常量 Foo\Bar\FOO
/* 限定名稱 */
subnamespace\foo(); // 解析為函數(shù) Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo,
// 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO
/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析為函數(shù) Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>
注意訪問任意全局類、函數(shù)或常量,都可以使用完全限定名稱,例如
\strlen() 或 \Exception 或
\INI_ALL
。
示例 #1 在命名空間內(nèi)部訪問全局類、函數(shù)和常量
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // 調(diào)用全局函數(shù)strlen
$b = \INI_ALL; // 訪問全局常量 INI_ALL
$c = new \Exception('error'); // 實例化全局類 Exception
?>