關於php名稱空間的理解
阿新 • • 發佈:2018-11-21
- 什麼是名稱空間以及如何定義名稱空間
一般情況向,在一個php程式原始碼檔案或同一個請求中是不允許有兩個以上相同名稱的類名、常量名或者函式名的,這樣的話,程式在執行的時候就會報錯。但是,在很多實際情況下,我們是無法避免在同一個檔案下有兩個以上相同名稱的類名、常量名或者函式名的。這種情況下就需要引入名稱空間。
舉個例子:
<?php
function getUser () {
return $username1;
}
function getUser () {
return $username2;
}
像這樣的程式在執行的時候是會報錯的。所以我們引入名稱空間,如下:
<?php
namespace get1
function getUser () {
return $username1;
}
namespace get2
function getUser () {
return $username2;
}
如何理解名稱空間的含義呢?以上面的程式碼為例,我們把這個PHP檔案想象成是一個資料夾,而裡面的兩個函式想象成是兩個檔案,但是在同一個資料夾下是不允許有兩個相同名稱的檔案的,所以我們就必須的將他們分到兩個不同名稱的資料夾中。名稱空間的道理就是這樣的。
特別注意:
名稱空間只對類名、函式名、常量(const定義的)有效。
一個檔案的最前面的namespace前面不能有任何有效的字元
- 如何使用名稱空間?
例如,我們如何使用上面定義的get2下的getUser()呢?
1)在訪問函式(或常量、類名)的時候,不指定所在名稱空間時,採用就近原則訪問(訪問當前名稱空間下的)。
2)那麼,如何訪問指定名稱空間下的內容呢?如下:
\get1\getUser(); // 訪問get1下的getUser()方法
- 多級名稱空間及三種訪問方式
1)多級名稱空間:
想象一下,如果一個PHP專案檔案是一個資料夾,而一個資料夾下面也會有一級子資料夾,而在一級子資料夾下又有子資料夾(二級子資料夾),名稱空間也是同樣的道理,一個名稱空間下,可能還有名稱空間,這就是所謂的多級名稱空間,例如laravel中:
namespace App\Http\Controllers;
這就是一個多級名稱空間。至於訪問方式同一般命與名空間中的一樣。
2)名稱空間的三種訪問方式(和相對路徑與絕對路徑相似)
A. 非限定名稱訪問方式
B. 限定名稱訪問方式
C. 完全限定名稱訪問方式
getUser(); // 非限定名稱訪問方式
\app\get1\getUser(); //完全限定名稱訪問方式,從根路徑開始,類似絕對路徑
app\get1\getUser(); //限定名稱訪問方式,不是從根路徑開始,類似相對路徑
- 名稱空間的引入機制
1)空間的引入:關鍵字use,注意:當移入空間後,必須要用限定名稱訪問方式訪問引入空間裡面的函式(或類、常量),不能使用非限定名稱方式訪問,這樣會訪問到當前名稱空間下的函式(或類、常量)。
2)空間類元素的引入:關鍵字use。注意:只能引入類,然後可以使用非限定名稱訪問。
參考:https://www.jianshu.com/p/24c7a5ec4564