http://php.net/manual/zh/language.namespaces.basics.php#language.namespaces.basics
(PHP 5 >= 5.3.0, PHP 7)
在討論如何使用命名空間之前,必須了解 PHP 是如何知道要使用哪一個(gè)命名空間中的元素的』盟可以將 PHP 命名空間與文件系統(tǒng)作一個(gè)簡(jiǎn)單的類比鉴未。在文件系統(tǒng)中訪問一個(gè)文件有三種方式:
- 相對(duì)文件名形式如foo.txt疫衩。它會(huì)被解析為 currentdirectory/foo.txt邑商,其中 currentdirectory 表示當(dāng)前目錄删掀。因此如果當(dāng)前目錄是 /home/foo殃姓,則該文件名被解析為/home/foo/foo.txt袁波。
- 相對(duì)路徑名形式如subdirectory/foo.txt。它會(huì)被解析為 currentdirectory/subdirectory/foo.txt蜗侈。
- 絕對(duì)路徑名形式如/main/foo.txt篷牌。它會(huì)被解析為/main/foo.txt。
PHP 命名空間中的元素使用同樣的原理踏幻。例如枷颊,類名可以通過三種方式引用:
- 非限定名稱,或不包含前綴的類名稱该面,例如 $a=new foo(); 或 foo::staticmethod();夭苗。如果當(dāng)前命名空間是currentnamespace,foo 將被解析為 currentnamespace\foo隔缀。如果使用 foo 的代碼是全局的题造,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo猾瘸。 警告:如果命名空間中的函數(shù)或常量未定義晌梨,則該非限定的函數(shù)名稱或常量名稱會(huì)被解析為全局函數(shù)名稱或常量名稱桥嗤。詳情參見 使用命名空間:后備全局函數(shù)名稱/常量名稱。
- 限定名稱,或包含前綴的名稱仔蝌,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();泛领。如果當(dāng)前的命名空間是 currentnamespace,則 foo 會(huì)被解析為 currentnamespace\subnamespace\foo敛惊。如果使用 foo 的代碼是全局的渊鞋,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespace\foo瞧挤。
- 完全限定名稱锡宋,或包含了全局前綴操作符的名稱,例如特恬, $a = new \currentnamespace\foo(); 或\currentnamespace\foo::staticmethod();执俩。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo癌刽。
下面是一個(gè)使用這三種方式的實(shí)例:
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
foo::staticmethod(); // 解析為類 Foo\Bar\foo的靜態(tài)方法staticmethod
echo FOO; // resolves to constant 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衡奥。
Example #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'); // 實(shí)例化全局類 Exception
?>
namespace關(guān)鍵字和NAMESPACE常量
PHP支持兩種抽象的訪問當(dāng)前命名空間內(nèi)部元素的方法远荠,NAMESPACE 魔術(shù)常量和namespace關(guān)鍵字矮固。
常量NAMESPACE的值是包含當(dāng)前命名空間名稱的字符串。在全局的譬淳,不包括在任何命名空間中的代碼档址,它包含一個(gè)空的字符串。
例子:
<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>
關(guān)鍵字 namespace 可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素邻梆。它等價(jià)于類中的 self 操作符守伸。
<?php
namespace MyProject;
use blah\blah as mine; // see "Using namespaces: importing/aliasing"
blah\mine(); // calls function MyProject\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>
使用命名空間:別名/導(dǎo)入
允許通過別名引用或?qū)胪獠康耐耆薅Q,是命名空間的一個(gè)重要特征确虱。這有點(diǎn)類似于在類 unix 文件系統(tǒng)中可以創(chuàng)建對(duì)其它的文件或目錄的符號(hào)連接含友。
所有支持命名空間的PHP版本支持三種別名或?qū)敕绞剑簽轭惷Q使用別名替裆、為接口使用別名或?yàn)槊臻g名稱使用別名校辩。PHP 5.6開始允許導(dǎo)入函數(shù)或常量或者為它們?cè)O(shè)置別名。
在PHP中辆童,別名是通過操作符 use 來實(shí)現(xiàn)的. 下面是一個(gè)使用所有可能的五種導(dǎo)入方式的例子:
<?php
namespace foo;
use My\Full\Classname as Another;
// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 導(dǎo)入一個(gè)全局類
use ArrayObject;
// importing a function (PHP 5.6+)
use function My\Full\functionName;
// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;
// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;
$obj = new namespace\Another; // 實(shí)例化 foo\Another 對(duì)象
$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對(duì)象
// 如果不使用 "use \ArrayObject" 宜咒,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>