標籤:
PHP 5.3 及以上版本中引入了命名空間 的概念。
notes:
1. 在 PHP 中,命名空間用來解決在編寫 類庫 或 應用程式 時建立 可重用 的 代碼如 類 或 函數 時碰到的兩類問題:
① 使用者編寫的代碼與 PHP 內部的 類 / 函數 / 常量 或 第三方類 / 函數 / 常量 之間的名字衝突;
② 為很長的標識符名稱 ( 通常是為了緩解第一類問題而定義的 ) 建立一個別名(或簡短)的名稱,提高原始碼的可讀性。
2. 如果一個檔案中包含命名空間,它必須在其它所有代碼之前聲明命名空間。
【例1】同目錄下的兩個 php 檔案
file 1:Member.php
<?phpnamespace member;class Member { public $name;}
file 2:test.php
<?phpnamespace test;include ‘Member.php‘;$res = new \member\Member();var_dump($res);
引用 Member 類時需要使用 命名空間運算子(namespace operater,就是類前面的那個反斜線),PHP 將從命名空間棧的頂部開始尋找類。
要引用 Member 類,需要知道當前檔案在哪一個命名空間中,如:
a. 在 member 命名空間中,Member 類稱為 Member
b. 在 全域命名空間 中,稱為 member/Member
c. 在 其他明明空間中,稱為 \member\Member
執行 test.php,輸出:
object(member\Member)[1] public ‘name‘ => null
3. 定義子命名空間
與目錄和檔案的關係很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義。
4. 使用命名空間:別名 / 匯入
允許通過別名引用或匯入外部的完全限定名稱,是命名空間的一個重要特徵。這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號串連。
所有支援命名空間的PHP版本支援三種別名或匯入方式:為類名稱使用別名、為介面使用別名或為命名空間名稱使用別名。PHP 5.6 開始允許匯入函數或常量或者為它們設定別名。
【例2】
file 1:Member.php
<?phpnamespace MyProject\member;class Member { public $name; public static function getName(){ return ‘my name is dee‘; }}
file 2: test.php
<?phpnamespace test;use MyProject\member;include ‘Member.php‘;echo member\Member::getName();
或
<?phpnamespace test;use MyProject\member as m;include ‘Member.php‘;echo m\Member::getName();
輸出:my name is dee
至於在架構中沒有使用 include 函數 是由於使用了 __autoload 函數自動負載檔案,但是該函數只能在 非命名控制項下 定義,也就是 全域 情況下:
Member.php
<?phpclass Member { public $name; public static function getName(){ return ‘my name is dee‘; }}
test.php
<?phpfunction __autoload($classname){ include $classname.‘.php‘;} echo Member::getName();
如果在已經有了 命名空間 的類中,可以使用函數 spl_auto_register 來註冊一個類中的方法來代替 __autoload 函數(參見 http://blog.csdn.net/sky_zhe/article/details/38523145)。
5. 可以通過 __NAMESPACE__ 查看當前明明空間:
<?phpnamespace test;function testNamespace(){ return __NAMESPACE__;}echo testNamespace();
輸出:test
參考:
http://www.php.net/manual/zh/language.namespaces.php
http://www.oschina.net/question/147332_138188
http://higrid.net/hi/docs/php-namespace-and-autoload
http://php.net/manual/zh/function.spl-autoload-register.php
PHP 命名空間總結