PHP5.3當中就引入了“命名空間”的概念,一直都沒怎么關注和使用,其實學習它也挺簡單的,看官方的教程就行了:
注意:PHP 命名空間目前僅支持 類名稱 和 命名空間 的導入,暫不支持導入函數或常量!
FAQ: things you need to know about namespaces
學習、實踐筆記:
1、定義命名空間時,命名空間開頭不能有反轉義符“\”,即 namespace \A\B\C; 是錯誤的,此命名空間將不起作用!namespace A\B\C; 才是對的。
2、導入命名空間時,如果命名空間是一級的,則開頭一定要加反轉義符“\”,即 use A; 是錯誤的,use \A; 才是對的。
3、導入命名空間時,如果命名空間是二級或更多級的,則開頭有沒有加反轉義符“\”效果都是一樣,即都表示 完全限定名稱,如 use A\B\C; 跟 use \A\B\C; 是等效的。(如果是多級的,建議開頭不加“\”)
4、對於“非限定名稱函數/常量”,如果 當前命名空間 有,則調用當前命名空間下的該 函數/常量,否則,繼續到 全局命名空間 下去找,有,則調用,沒有,則報錯!
5、對於“非限定名稱類”,如果 當前命名看空間 有,則調用當前命名空間下的該 類,沒有,則調用__autoload函數,還沒有的話,就直接報錯!即不會繼續到 全局命名空間 下去找了!
6、對於“限定名稱函數/常量”,如果 當前命名看空間 有,則調用當前命名空間下的該 限定名稱函數/常量,沒有,則直接報錯!即不會繼續到 全局命名空間 下去找了!
7、對於“限定名稱類”,如果 當前命名看空間 有,則調用當前命名空間下的該 限定名稱類,沒有,則調用__autoload函數,還沒有的話,就直接報錯!即不會繼續到 全局命名空間 下去找了!
8、上面說的常量指的是通過關鍵字const定義的常量,而函數define()定義的常量是不受命名空間影響的,即在任何地方都可用,具有全局性!另外 global 變量也不受命名空間影響!
額,補充一點,還有可能到 導入的命名空間 下去找!
使用建議:
1、強烈推薦使用“命名空間”的功能;
2、只把“類”命令空間化,其他的(如函數、常量)最好還是設計為全局性,即放在全局命名空間中,方便調用;
3、命名空間 + autoload機制,實現“類文件”自動加載;
