php.net
(PHP 5 >= 5.3.0, PHP 7)
定義命名空間
雖然任意合法的PHP程式碼都可以包含在命名空間中,但只有以下類型的程式碼受命名空間的影響,它們是:類別(包括抽象類別和traits)、介面、函數和常數。
如果一個檔案包含命名空間,它必須在其它所有程式碼之前聲明命名空間,除了一個以外:declare關鍵字。所有非 PHP 程式碼包括空格符都不能出現在命名空間的宣告之前。
<html> <?phpnamespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
同一個命名空間可以定義在多個檔案中,即允許將同一個命名空間的內容分割存放在不同的檔案中。
定義子命名空間
<?php namespace MyProject\Sub\Level; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
在同一個檔案中定義多個命名空間
註:在實際的程式實作中,非常不提倡在同一個檔案中定義多個命名空間!
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } }namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } }?>
使用命名空間
類別名稱的三種引用方式:
非限定名稱(名稱中不包含命名空間分隔符號的識別碼),或不包含前綴的類別名稱。例如 $a=new foo(); 或 foo::staticmethod();。如果目前命名空間是 currentnamespace,foo 將會解析為 currentnamespacefoo。如果使用 foo 的程式碼是全域的,不包含在任何命名空間中的程式碼,則 foo 會被解析為foo。 * *警告**:如果命名空間中的函數或常數未定義,則該非限定的函數名稱或常數名稱會被解析為全域函數名稱或常數名稱。
限定名稱(名稱中含有命名空間分隔符號的識別碼),或包含前綴的名稱,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果目前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespacesubnamespacefoo。如果使用 foo 的程式碼是全域性的,不包含在任何命名空間中的程式碼,foo 會被解析為subnamespacefoo。
完全限定名稱(名稱包含命名空間分隔符,並以命名空間分隔符開始的標識符),或包含了全域前綴操作符的名稱。存取任意全域類別、函數或常數,都可以使用完全限定名稱,例如 strlen() 或 Exception 。
tips:
$a = '\namespacename\classname'; $obj = new $a; $a = 'namespacename\classname'; $obj = new $a; $b = 'namespacename\funcname'; $b(); // prints namespacename\funcname$b = '\namespacename\funcname'; $b(); // also prints namespacename\funcname
使用相關常數
常數__NAMESPACE__的值是包含目前命名空間名稱的字串。在全域的,不包括在任何命名空間中的程式碼,它包含一個空的字串。
使用命名空間:別名/導入
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 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; // 实例化 foo\Another 对象 $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象 func(); // calls function My\Full\functionName echo CONSTANT; // echoes the value of My\Full\CONSTANT ?>
類別名稱總是解析到目前命名空間中的名稱。因此在存取系統內部或不包含在命名空間中的類別名稱時,必須使用完全限定名稱。