在PHP中,函數、類和常量都是不容許同名的,一旦同名就會呈現過錯。但是在大型項目開發中,不一樣團隊負責的模塊或許不一樣,那麼就很難防止呈現同名結構,因此「命名空間」就產生了,「命名空間」確保了即便呈現了同名結構,也不會影響到整個項目。
1、命名空間界說:命名空間是指人爲的將內存進行分隔,讓不一樣內存區域的同名結構共存。從而解決在大型本項目中或許呈現的重名結構問題。
2、命名空間語法:namespace+空間名字
3、命名空間的拜訪辦法
非限制稱號拜訪:成員前面不能有任何的命名空間,不能有「\」,瞭解成文件當時路徑,如:echoHuman::PERSON_NAME。
限制稱號拜訪:成員稱號前面至少要有一個命名空間,至少要有一個反斜線「\」,且不能在首位,瞭解成相對路徑。限制稱號的拜訪是基於子空間來完成的,如echospace2\Human::PERSON_NAME。
完全限制稱號拜訪:這個拜訪方法是默認的,用的最多的。拜訪老是從根空間(即大局空間)開端拜訪,榜首個字符必定是反斜線(「\」),可以將完全限制稱號拜訪瞭解成絕對路徑,運用「\」做爲大局空間開端符號。如echo\space3\Human::PERSON_NAME。
代碼舉例:
namespacespace1;
echo__NAMESPACE__.’
‘;
classHuman
{
constPERSON_NAME=’王小丁’;
}
//1.非限制稱號
echoHuman::PERSON_NAME;
echo’
‘;
//2.限制稱號
namespacespace;
echospace2\Human::PERSON_NAME.’
‘;
namespacespace\space2;
echo__NAMESPACE__.’
‘;
classHuman
{
constPERSON_NAME=’王小丁’;
}
//3.完全限制稱號(默認的,用的最多的)
echo’
‘;
namespacespace3;
echo__NAMESPACE__.’
‘;
classHuman
{
constPERSON_NAME=’王小丁’;
}
echo\space3\Human::PERSON_NAME;
輸出做用:
4、命名空間的別號與類別號
PHP命名空間支撐有兩種運用別號或導入方法:爲類稱號運用別號,或爲命名空間稱號運用別號。
代碼舉例:
//1.命名空間的別號
namespacemyspace1;
classC1
{
//…
}
echo\myspace2\C2::index(),’
‘;
echo\myspace2\C3::cate(),’
‘;
namespacemyspace2;
classC2
{
publicstaticfunctionindex()
{
return’主頁’;
}
}
classC3
{
publicstaticfunctioncate()
{
return’頻道頁’;
}
}
namespacemyspace3;
//use用來聲明空間別號,use默認就是從根空間開端
//給外部的空間起了一個別號,myspace2===>s
usemyspace2ass;
echos\C2::index(),’
‘;
echos\C3::cate(),’
‘;
//2.類級的別號
//給外部空間中的類,起一個別號
//usemyspace2\C2asC2;
//usemyspace2\C3asC3;
//echoC2::index(),’
‘;
//echoC3::cate(),’
‘;
//類別號與原始類名相同,此時可以省掉類別號,雖然可以這樣運用,但是主張起上名字
//usemyspace2\C2;
//由於當時類中與有一個與之抵觸的類名C2
usemyspace2\C2asC;
usemyspace2\C3;
echoC2::index(),’
‘;
echoC::index(),’
‘;
echoC3::cate(),’
‘;
classC2
{
publicstaticfunctionindex()
{
return’主頁NS-T2’;
}
}
輸出做用:
5、類文件的主動加載
若是想完成主動加載,需求知足兩個條件
1.命名空間有必要和類文件所在的絕對路徑一一對應
2.當時類稱號與當時的類文件的稱號完全一致
//封裝主動加載器
//需求在同一路徑下創立一個或許幾個php文件,且需求創立一個autoload.php文件來做引進橋樑
require’autoload.php’;
echo’
‘;
useinc\lib\Demo1;
useinc\lib\Demo2;
useinc\lib\Demo3;
echoDemo1::say(),’
‘;
echo’
‘;
echoDemo2::say(),’
‘;
echo’
‘;
echoDemo3::say(),’
‘;
echo’
‘;
autoload.php代碼舉例
try{
spl_autoload_register(function($className){
//1.應該將類名中的命名空間的分隔符轉爲目錄分隔符
$path=str\_replace(‘\\\\’,DIRECTORY\_SEPARATOR,$className);
echo$path,’
‘;
//2.生成真正要加載的類文件稱號
$file=\_\_DIR\_\_.DIRECTORY\_SEPARATOR.$path.’.php’;
echo$file,’
‘;
//3.加載這個文件
require$file;
});
}catch(Exception$e){
die($e->getMessage());
}
輸出做用:
6、總結
1.不一樣的命名空間裏面可以界說同名的函數、類和常量。
2.命名空間裏可以書寫任意代碼。
3.非限制稱號拜訪,直接拜訪當時目錄。
4.限制稱號拜訪,拜訪的是當時目錄的子目錄。
5.完全限制稱號拜訪,是從大局即根目錄下開端拜訪。
6.大局空間的元素拜訪運用完全限制稱號拜訪
7.體系內置的類、函數和常量都歸於大局空間。
8.體系函數、常量,在命名空間內拜訪的時分,體系會主動在本身空間找,若是找不到會到大局空間找。
9.體系類有必要運用大局空間拜訪:\類名
10.命名空間的別號可以簡化代碼。
11.類文件的主動加載雖然在嵌套時需求創立多個文件,但是對於後期的數據保護與更新,倒是簡練方便的。php