PHP5.3當中就引入了「命名空間」的概念,一直都沒怎麼關注和使用,其實學習它也挺簡單的,看官方的教程就好了:php
命名空間概述html
定義命名空間函數
定義子命名空間學習
使用命名空間:基礎.net
namespace關鍵字和__NAMESPACE__常量htm
使用命名空間:別名/導入blog
注意:PHP 命名空間目前僅支持 類名稱 和 命名空間 的導入,暫不支持導入函數或常量!教程
FAQ: things you need to know about namespaces
學習、實踐筆記:
一、定義命名空間時,命名空間開頭不能有反轉義符「\」,即 namespace \A\B\C; 是錯誤的,此命名空間將不起做用!namespace A\B\C; 纔是對的。
二、導入命名空間時,若是命名空間是一級的,則開頭必定要加反轉義符「\」,即 use A; 是錯誤的,use \A; 纔是對的。
三、導入命名空間時,若是命名空間是二級或更多級的,則開頭有沒有加反轉義符「\」效果都是同樣,即都表示 徹底限定名稱,如 use A\B\C; 跟 use \A\B\C; 是等效的。(若是是多級的,建議開頭不加「\」)
四、對於「非限定名稱函數/常量」,若是 當前命名空間 有,則調用當前命名空間下的該 函數/常量,不然,繼續到 全局命名空間 下去找,有,則調用,沒有,則報錯!
五、對於「非限定名稱類」,若是 當前命名看空間 有,則調用當前命名空間下的該 類,沒有,則調用__autoload函數,尚未的話,就直接報錯!即不會繼續到 全局命名空間 下去找了!
六、對於「限定名稱函數/常量」,若是 當前命名看空間 有,則調用當前命名空間下的該 限定名稱函數/常量,沒有,則直接報錯!即不會繼續到 全局命名空間 下去找了!
七、對於「限定名稱類」,若是 當前命名看空間 有,則調用當前命名空間下的該 限定名稱類,沒有,則調用__autoload函數,尚未的話,就直接報錯!即不會繼續到 全局命名空間 下去找了!
八、上面說的常量指的是經過關鍵字const定義的常量,而函數define()定義的常量是不受命名空間影響的,即在任何地方均可用,具備全局性!另外 global 變量也不受命名空間影響!
額,補充一點,還有可能到 導入的命名空間 下去找!
使用建議:
一、強烈推薦使用「命名空間」的功能;
二、只把「類」命令空間化,其餘的(如函數、常量)最好仍是設計爲全局性,即放在全局命名空間中,方便調用;
三、命名空間 + autoload機制,實現「類文件」自動加載;