1.什么是命名空間?
什么是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統中目錄用來將相關文件分組,對於目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。
2.命名空間有什么用?
(1)防止用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
(2)為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
3.命名空間在tp5中的作用?
采用命名空間方式定義和自動加載類庫文件,有效的解決了多模塊和Composer類庫之間的命名空間沖突問題,並且實現了更加高效的類庫自動加載機制。
如果你需要調用PHP內置的類庫,或者第三方沒有使用命名空間的類庫,記得在實例化類庫的時候加上 \,例如:
// 錯誤的用法
$class = new stdClass();
$xml = new SimpleXmlElement($xmlstr);
// 正確的用法
$class = new \stdClass();
$xml = new \SimpleXmlElement($xmlstr);
注意:命名空間只對類、函數和用const定義的常量起作用,define定義的會報錯。真實的命名空間只是虛擬的目錄,而在tp中只是很巧妙的把它轉化成了真實的路徑。
4.命名空間的三種訪問方式
(1) 非限定名稱訪問
(2) 限定名稱訪問
(3) 完全限定名稱訪問
實例說明:
1 <?php 2 namespace beijing\haidian\tiananmen; 3 4 class Animal{ 5 public $obj='dog'; 6 static $name='wangwang'; 7 8 } 9 10 function getmsg() 11 { 12 echo '北京海淀'; 13 } 14 15 16 namespace shanghai\putuo\mingzhu; 17 18 class Animal{ 19 public $obj='pig'; 20 static $name='hengheng'; 21 } 22 23 function getmsg() 24 { 25 echo '上海普陀'; 26 } 27 28 //非限定名稱訪問,沒有指定命名空間,默認使用最近的命名空間 29 getmsg(); //此處直接調用函數,輸出的將會是 上海普陀 30 31 //限定名稱訪問 32 mingzhu\getmsg(); 33 //限定名稱訪問有點類似於相對路徑,此時尋找函數時,會在原本的命名空間下來找。 34 //此時要找的getmsg()是shanghai\putuo\mingzhu\mingzhu\getmsg() 35 36 //完全限定名稱訪問 37 \beijing\haidian\tiananmen\getmsg(); //完全限定名稱訪問最前邊都會有一個\,此時會在全局搜索類似絕對路徑 38 //輸出北京海淀
5.命名空間的引用和引用空間類
1 <?php 2 namespace beijing\haidian\tiananmen; 3 4 class Animal{ 5 public $obj='dog'; 6 static $name='wangwang'; 7 8 } 9 10 function getmsg() 11 { 12 echo '北京海淀'; 13 } 14 15 16 namespace shanghai\putuo\mingzhu; 17 18 class Animal{ 19 public $obj='pig'; 20 static $name='hengheng'; 21 } 22 23 function getmsg() 24 { 25 echo '上海普陀'; 26 } 27 28 29 $a=new Animal(); 30 echo $a->obj; 31 32 /*我們先實例化這個動物類,訪問他的成員屬性obj 此時輸出的是 pig*/ 33 //但是如果我們要訪問最頂端的動物類的成員屬性要怎么辦呢,就要使用完全限定名稱訪問 34 $b=new \beijing\haidian\tiananmen\Animal; 35 echo $b->obj; //此處會輸出dog 36 37 /**由此引出一個問題,當命名空間的級別很多時,我們要調用的時候就會相當繁瑣,解決辦法就是引入空間**/ 38 use beijing\haidian\tiananmen; 39 getmsg(); //此時調用會輸出什么的呢,居然是上海普陀,為什么不是北京海淀呢 40 //這是因為在引入空間之后,如果我們想要訪問這個空間下的函數、類等,必須用限定名稱的方式 41 tiananmen\getmsg(); //此時會輸出北京海淀 42 43 //調用類 44 $c=new tiananmen\Animal(); 45 echo $c->obj; //輸出dog 46 47 /*此時你會發現一個問題,調用類時還得必須用限定名稱訪問的模式,還是麻煩,有沒有更簡單的方法呢
6.引入空間類
1 <?php 2 namespace beijing\haidian\tiananmen; 3 4 class Animal{ 5 public $obj='dog'; 6 static $name='wangwang'; 7 8 } 9 10 function getmsg() 11 { 12 echo '北京海淀'; 13 } 14 15 16 namespace shanghai\putuo\mingzhu; 17 18 19 function getmsg() 20 { 21 echo '上海普陀'; 22 } 23 24 25 //引入空間類 26 use beijing\haidian\tiananmen\Animal; 27 //之后可以直接使用 28 $a=new Animal(); 29 echo $a->obj; //此處輸出dog 30 echo Animal::$name; //此處輸出wangwang
