tp5中命名空間的應用


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

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM