主頁 > 知識(shí)庫 > 詳細(xì)解讀php的命名空間(一)

詳細(xì)解讀php的命名空間(一)

熱門標(biāo)簽:離石地圖標(biāo)注 400電話辦理福州市 南寧高頻外呼回?fù)芟到y(tǒng)哪家好 深圳外呼系統(tǒng)收費(fèi) 江蘇外呼電銷機(jī)器人報(bào)價(jià) 400電話申請方法收費(fèi) 電話機(jī)器人危險(xiǎn)嗎 長沙crm外呼系統(tǒng)業(yè)務(wù) 專業(yè)電話機(jī)器人批發(fā)商

php的命名空間功能已經(jīng)出來很久了,但是一直以來沒怎么深究過,這次趕著有時(shí)間所以特意翻著手冊做一個(gè)整理和總結(jié)幫助自己完善完善,原本準(zhǔn)備一篇寫完,但發(fā)現(xiàn)內(nèi)容其實(shí)還是蠻多的,放一起太長看著累,所以分兩篇博客要好些。

一:命名空間概念:命名空間是一種封裝事物的方法,類似于目錄和文件。

命名空間解決的問題(手冊上也寫的很清楚,下面按照自己的理解簡化了):

1:解決程序編寫者自己寫的類、常量、函數(shù)和php內(nèi)部的或者第三方的出現(xiàn)名稱沖突的情況。

2:創(chuàng)建別名,幫助解決類、常量、函數(shù)名稱過長的情況,幫助提高代碼的可讀性,另外名稱過長其實(shí)通常都是因?yàn)闉榱司徑獾谝活悊栴}導(dǎo)致的。

二:如何定義命名空間

1:命名空間用關(guān)鍵字namespace聲明,同時(shí)命名空間必須位于其他代碼之前,包括任何非php代碼以及空白符(php的declare關(guān)鍵字除外),否則會(huì)拋出一個(gè)fatal error。

例如:

?php 
namespace Index; 
?> 

注意1:如果命名空間namespace前沒有任何代碼及空白符,但還是出現(xiàn)fatal error,這個(gè)應(yīng)該是由于bom頭導(dǎo)致的,去掉bom頭就可以了。
注意2:在命名空間下,雖然可以放置所有合法的php代碼,但是受命名空間影響的僅有類(抽象類以及traits)和接口、常量和函數(shù)。

2:與目錄和文件的關(guān)系很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義,分隔符是\。

例如:

?php 
namespace Index\Col\File; 
define('MESSAGE','hello world'); 
?> 

3:一個(gè)文件中可以定義多個(gè)命名空間,定義的語法有兩種,一種是簡單組合語法,另一種是大括號(hào)形式語法,另外一個(gè)文件定義多個(gè)命名空間的使用一般是多個(gè)文件合并成一個(gè)文件的場景,但不到萬不得已最好不要這樣,因?yàn)檫@樣增加了代碼的復(fù)雜度,可讀性會(huì)降低,一般情況也沒有這種使用的必要。

簡單組合語法:

?php 
namespace Index; 
const INSTANCE=1; 
 
namespace Col; 
const INSTANCE=2; 
?> 

大括號(hào)語法,一個(gè)文件多個(gè)命名空間,如果還需要寫上非命名空間的代碼,就只能用大括號(hào)語法,并且非命名空間代碼用namespace聲明一個(gè)沒有名稱的命名空間,再用大括號(hào)即可:

?php 
/*命名空間Index*/ 
namespace Index{ 
  const INSTANCE=1; 
} 
 
/*命名空間Col*/ 
namespace Col{ 
  const INSTANCE=2; 
} 
 
/*全局非命名空間代碼*/ 
namespace { 
  const INSTANCE=3; 
} 
?> 

4:多個(gè)不同的文件可以定義同一個(gè)命名空間,也就是說同一個(gè)命名空間的內(nèi)容可以分別存儲(chǔ)到多個(gè)不同的文件中,這里就不舉例了。

三:命名空間的識(shí)別原理

命名空間的使用原理有三種情況,手冊上其實(shí)說的詳細(xì)但可能因?yàn)榉g問題導(dǎo)致一些凌亂,這里我簡化一下用自己的例子梳理一下:

1:沒有限定名稱,也就是直接使用要讀取的類、常量、函數(shù)、接口名稱,這種情況會(huì)讀取該內(nèi)容所屬的命名空間的類、常量、函數(shù)、接口名稱,但如果命名空間內(nèi)沒有相關(guān)的數(shù)據(jù),如果是類和接口名稱會(huì)返回fatal error,如果是函數(shù)和常量會(huì)自動(dòng)讀取全局的函數(shù)和常量,如果全局中也沒有,才會(huì)報(bào)fatal error。

下面舉例:

?php 
/*全局非命名空間代碼*/ 
namespace { 
  const INSTANCE=1; 
 
  function test(){ 
    echo 1; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 1; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出來的是1 
 
  test();       //輸出1 
 
  foo::fool();      //輸出1 
 
} 
 
/*命名空間Index*/ 
namespace Index{ 
  const INSTANCE=2; 
 
  function test(){ 
    echo 2; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 2; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出來的是2 
 
  test();     //輸出2 
 
  foo::fool();    //輸出2 
} 
 
/*命名空間Col*/ 
namespace Col{ 
  const INSTANCE=3; 
 
  function test(){ 
    echo 3; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 3; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出來的是3 
 
  test();     //輸出2 
   
  foo::fool();    //輸出2 
} 
?>

上面的例子每個(gè)命名空間里輸出的都沒有限定名稱,所以會(huì)得到當(dāng)前命名空間下設(shè)置的對應(yīng)數(shù)據(jù)值。

如果當(dāng)前命名空間沒有設(shè)置,函數(shù)和常量則會(huì)讀取全局設(shè)置的對應(yīng)數(shù)據(jù)值,全局沒有對應(yīng)的才會(huì)報(bào)fatal error,類和接口都會(huì)直接報(bào)fatal error,如下面代碼所示。

?php 
/*全局非命名空間代碼*/ 
namespace { 
  const INSTANCE=1;  
  function test(){ 
    echo 1; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 1; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出來的是1  
  test();     //輸出1  
  foo::fool();    //輸出1  
} 
 
/*命名空間Index*/ 
namespace Index{ 
  var_dump(INSTANCE);   //打印出來的是1  
  test();     //輸出1  
  foo::fool();    //fatal error 
 
} 
?> 

2:限定名稱,分為兩種情況,一種是包含前綴的限定名稱情況,一種是包含全局限定名稱的情況。手冊上將這兩種單獨(dú)分開了,但我覺得這兩種可以合并成一起說,他們都是有限定名稱,只是前者沒有全局限定,后者有全局限定。

①包含前綴的限定名稱,這種前綴可以有多個(gè)或者一個(gè)層級,但最左側(cè)不能為\全局限定詞,這種情況會(huì)讀取該代碼所在命名空間加上該前綴限定名稱所對應(yīng)數(shù)據(jù),也就是:

所處命名空間\前綴限定\名稱來讀取,如果該代碼是全局沒有命名空間的,則直接用前綴限定名稱來讀取,也就是:前綴限定\名稱來讀取。

實(shí)例代碼:

?php 
/*命名空間Col\Index*/ 
namespace Col\Index{ 
  const INSTANCE=1; 
} 
 
/*命名空間Index*/ 
namespace Index{ 
  const INSTANCE=2; 
} 
 
/*命名空間Col*/ 
namespace Col{ 
  const INSTANCE=3; 
  var_dump(Index\INSTANCE); //打印出來的是1 讀取的是Col\Index\INSTANCE 
} 
 
/*全局非命名空間代碼*/ 
namespace { 
  const INSTANCE=4; 
  var_dump(Index\INSTANCE); //打印出來的是2 讀取的是Index\INSTANCE 
} 
 
?> 

②全局限定前綴名稱:也就是在最左側(cè)有全局操作符\進(jìn)行修飾的前綴限定名稱,當(dāng)然也可以沒有前綴限定直接全局操作符\加上名稱也是可以的。但加上全局操作符后就跟目錄里的絕對路徑一樣,只會(huì)按照全局限定后的所設(shè)置的進(jìn)行讀取。

具體實(shí)例如下:

?php 
/*命名空間Col\Index*/ 
namespace Col\Index{ 
  const INSTANCE=1; 
} 
 
/*命名空間Index*/ 
namespace Index{ 
  const INSTANCE=2; 
} 
 
/*命名空間Col*/ 
namespace Col{ 
  const INSTANCE=3; 
  var_dump(\Index\INSTANCE); //打印出來的是2 讀取的是Index\INSTANCE 
} 
 
/*全局非命名空間代碼*/ 
namespace { 
  const INSTANCE=4; 
  var_dump(\Index\INSTANCE); //打印出來的是2 讀取的是Index\INSTANCE 
} 
 
namespace Lin{ 
  const INSTANCE=5; 
  var_dump(\INSTANCE); //打印出來的是4 讀取的是INSTANCE,是全局非命名空間里的INSTANCE,如果沒有全局操作符\,讀取的會(huì)是當(dāng)前命名空間的Lin\INSTANCE=5 
} 
 
?> 

四:命名空間在字符串中的轉(zhuǎn)義

有時(shí)候命名空間會(huì)放在字符串中使用,如果是單引號(hào)不會(huì)通過編譯器解釋,所以沒有任何問題,但是如果是雙引號(hào),那么就會(huì)有些意外情況了,要知道雙引號(hào)里的內(nèi)容是需要經(jīng)過編譯器進(jìn)行解釋然后再進(jìn)行輸出的,而\在編譯器里的解釋容易造成歧義

例如"index\name"這里就有\(zhòng)n會(huì)被解釋成換行,除此之外還有很多這種造成意外的情況。

因此一般我們推薦命名空間如果要放在字符串中使用,最好使用單引號(hào),一是效率,二是安全,如果使用雙引號(hào),則必須增加一個(gè)\進(jìn)行轉(zhuǎn)義避免歧義,例如"index\\name"這樣就沒有問題了。

隨手雙引號(hào)的舉個(gè)例子:

?php 
/*全局非命名空間代碼*/ 
namespace Index\Name{ 
  class foo{ 
    function __construct(){ 
      echo 2; 
    } 
  } 
} 
 
namespace{ 
  $a= "Index\\Name\\foo"; //用\轉(zhuǎn)義了\所以可以正常運(yùn)行,但是如果去掉轉(zhuǎn)義的話會(huì)報(bào)錯(cuò)Class 'Index\Nameoo',因?yàn)?f被解釋成了換頁符 
  $obj=new $a; 
} 

這部分礙于篇幅就暫時(shí)到這里了,下一篇主要總結(jié)命名空間里的namespace和__NAMESPACE__的使用,以及別名的使用等。

您可能感興趣的文章:
  • PHP命名空間簡單用法示例
  • PHP命名空間與自動(dòng)加載類詳解
  • PHP命名空間namespace及use的簡單用法分析
  • PHP命名空間namespace定義及導(dǎo)入use用法詳解
  • 詳細(xì)解讀php的命名空間(二)
  • 實(shí)例講解PHP中使用命名空間

標(biāo)簽:南京 株洲 興安盟 太原 濱州 曲靖 白酒營銷 南昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳細(xì)解讀php的命名空間(一)》,本文關(guān)鍵詞  詳細(xì),解讀,php,的,命名,空間,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳細(xì)解讀php的命名空間(一)》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳細(xì)解讀php的命名空間(一)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章