序言
ThinkPHP是一個快速、兼容而且簡單的輕量級國產PHP開發框架,使用ThinkPHP框架可以極大簡化我們的開發過程,節省時間。這個專題我將記錄自己學習使用ThinkPHP5.0的進行實戰開發的過程,學習資料。這篇文章首先介紹一個ThinkPHP中十分重要的概念:命名空間。
命名空間
由於PHP語法里不支持函數重載機制,如果一個應用里有兩個同名的方法,怎么辦?在Yii框架為了避免名字重復引起問題,全部的類前邊都有 C 字樣,而在ThinkPHP里就引入了命名空間這個概念。其中有幾點需要特別注意:
a) 命名空間是虛擬的定義空間,不是真實存在目錄
b) 命名空間的分隔符都是反斜杠 \
c) 命名空間只對函數,類,常量(const定義的常量,非define定義的常量)有效。
d) 命名空間有三種訪問方式:非限定名稱訪問方式;限定名稱訪問方式;完全限定名稱訪問方式。
接下來就一一詳細說明。
一、命名空間只對函數,類,常量(const定義的常量,非define定義的常量)有效。

這里我們聲明了兩個命名空間space1和space2,兩個命名空間下面有同名的函數getmsg(),同名的常量a,同名的類Animal,因為它們處於不同的命名空間下,所以不會產生錯誤。我們在瀏覽器中打開,得到如下輸出:helloworld。
如果我們嘗試用define定義兩個同名常量呢?

瀏覽器中打開報如下錯誤:

所以命名空間只對函數,類,常量(const定義的常量,非define定義的常量)有效。
二、多級命名空間和三種訪問方式
上面聲明的命名空間space1和space2都是單級命名空間,形如 space1\space2\space3的命名空間為多級命名空間,分隔符為\。下面介紹三種命名空間訪問方式:
1、非限定名稱訪問方式

當以非限定名稱訪問方式訪問時,訪問的是當前命名空間下的函數(類和常量同理),所以以上代碼輸出結果是:world。
2、完全限定名稱訪問方式
如果想要在 name2\space2 命名空間下訪問 name1\space1下的getmsg()方法,可以使用完全限定名稱訪問方式(相當於絕對路徑訪問)。

所以上述代碼的輸出結果為:hello。
3、限定名稱訪問方式
限定名稱訪問方式與完全限定名稱訪問方式差別只在最前面的\。如果上例使用限定名稱訪問方式訪問,則將最后一行改為:name1\space1\getmsg();
此時,我們在瀏覽器中打開,發現如下錯誤:

提示我們無法找到命名空間 name2\space2\name1\space1 下的 getmsg() 函數。原因是限定名稱訪問方式相當於相對路徑訪問,我們在當前命名空間下使用限定名稱訪問方式訪問:name1\space1\getmsg(),會在當前命名空間下尋找name1\space1下的getmsg()函數,找不到就會報錯。所以,如果我們再聲明一個名為: name2\space2\name1\space1 的命名空間,上述訪問就可以正常執行,如下:

輸出結果為:hello-world。
三、命名空間和空間類元素的引入機制
1、引入命名空間
通過上面的例子,我們可以看到如果想要在當前命名空間下使用另一個命名空間下的函數、常量或者類元素的時候,我們需要使用完全限定訪問方式進行訪問,寫代碼比較繁瑣,所以,我們可以引入命名空間,然后使用限定名稱訪問方式進行訪問,簡化訪問過程。

輸出結果為:hello
dog
2、引入空間類元素
與命名空間的引入方式類似,使用 use 關鍵字引入空間類元素,然后直接使用非限定訪問方式進行訪問即可。不過,在當前命名空間下不能存在與引入類同名的類,否則會產生錯誤。

輸出結果為:dog大黃。
四、公共空間
如果我們沒有使用 namespace 關鍵字聲明命名空間,則其屬於公共空間。
這里我們建立兩個php文件,1.php 和 2.php,1.php命名空間為 name1\space1, 2.php為公共空間。
1.php:
1 namespace name1\space1; 2 header("content-type:text/html;charset=utf-8"); 3 class Animal 4 { 5 public $obj = 'dog'; 6 static $name = '大黃'; 7 } 8 function getmsg() 9 { 10 echo 'hello'; 11 } 12 13 const MN = 123; 14 15 //在命名空間中引入公共命名空間 16 17 include ('./2.php'); 18 19 getmsg(); //訪問的是當前空間下的getmsg()函數 20 echo '</br>'; 21 \getmsg(); //訪問的是公共命名空間(即2.php文件)下的getmsg()函數 22 23 echo '</br>'; 24 echo MN; //會先在當前命名空間下尋找MN常量,如果找到就輸出,如果找不到,就會去公共命名空間尋找MN常量 25 echo '</br>'; 26 echo \MN; //訪問的是公共命名空間(即2.php文件)下的MN常量
2.php:
1 //沒有指定命名空間,則其屬於公共命名空間 2 function getmsg() 3 { 4 echo 'world'; 5 } 6 7 const MN = '456';
瀏覽器中打開1.php,輸出結果為:
hello
world
123
456
五、 命名空間是虛擬的定義空間,不是真實存在目錄
在thinkphp5.0中,命名空間是虛擬的定義空間,不是真實存在目錄。只不過是官方在聲明命名空間時,命名空間的名稱刻意與目錄結構有對應關系。

例如,我們打開 application/index/controller 文件夾下的 Index.php 文件,其命名空間為:app\index\controller。在目錄結構中並不存在。
以上就是關於thinkphp中關於命名空間的全部內容,了解清楚之后就可以進行實戰開發了。
