命名空間其實早在PHP5.3就已經出現了。不過大部分同窗可能在各類框架的使用中才會接觸到命名空間的內容,固然,現代化的開發也都離不開這些可以快速產出的框架。此次咱們不從框架的角度,僅從簡單的代碼角度來解析一下命名空間的概念和使用。php
首先,咱們要定義命名空間是個什麼東西。git
其實就像操做系統的目錄同樣,命名空間就是爲了解決相似於操做系統中同一個文件夾不能有相同的文件名同樣的問題。假設咱們只有一個文件,一個目錄,那麼在這個目錄中,是不能有兩個徹底相同的文件的。若是有這樣名稱徹底相同的文件,那麼操做系統也不知道咱們到底應該打開的是哪個文件。同理,在一個PHP文件中,咱們也不能起相同名稱的函數或者類名,PHP也不知道咱們到底要調用的是哪個函數或者類。github
理解了上述內容以後,再來看命名空間的語法,其實很是像咱們的目錄的定義。微信
namespace A\B\C;
這個命名空間的定義就是指出了當前命名空間是A\B\C。就像是C:\A\B\C這樣一個文件夾同樣。光說不練假把式,直接上代碼來看看:composer
// file1.php namespace FILE1; const CONST_A = 2; function testA(){ echo 'FILE1\testA()', PHP_EOL; } class objectA{ function test(){ echo 'FILE1\ObjectA', PHP_EOL; } }
// file2.php namespace FILE2; const CONST_A = 3; function testA(){ echo 'FILE2\testA()', PHP_EOL; } class objectA{ function test(){ echo 'FILE2\ObjectA', PHP_EOL; } }
咱們在namespace目錄下建立了這兩個php文件,函數和類名都是同樣的,但定義了不一樣的命名空間,一個是FILE1,一個是FILE2。框架
namespace A; include 'namespace/file1.php'; include 'namespace/file2.php'; use FILE1, FILE2; use FILE1\objectA as objectB; const CONST_A = 1; function testA(){ echo 'A\testA()', PHP_EOL; } class objectA{ function test(){ echo 'A\ObjectA', PHP_EOL; } } // 當前命名空間 echo CONST_A, PHP_EOL; // 1 testA(); // A\testA() $oA = new objectA(); $oA->test(); // A\ObjectA // FILE1 echo FILE1\CONST_A, PHP_EOL; // 2 FILE1\testA(); // FILE1\testA() $oA = new FILE1\objectA(); $oA->test(); // FILE1\ObjectA $oB = new objectB(); $oB->test(); // FILE1\ObjectA // FILE2 echo FILE2\CONST_A, PHP_EOL; // 3 FILE2\testA(); // FILE2\testA() $oA = new FILE2\objectA(); $oA->test(); // FILE2\ObjectA
在測試代碼中,咱們又定義了當前的命名空間爲A。並include了file1.php和file2.php。並在這個文件中同時也定義了與file1.php和file2.php中相同的函數和類名。接下來咱們依次調用這些靜態變量、函數和類。函數
命名空間的使用其實就是這麼的簡單。能夠看出咱們在不一樣的命名空間中就可使用相同的函數或者類名了。這一點正是各種現代化開發框架的基礎。同時也是composer可以實現的最主要的緣由之一。學習
接下來,咱們嘗試一個問題是否符合咱們的預期,那就是兩個文件定義相同的命名空間是否可以定義相同的類名呢?測試
// file1-1.php namespace FILE1; const CONST_A = 1.1; function testA(){ echo 'FILE1-1\testA()', PHP_EOL; } class objectA{ function test(){ echo 'FILE1-1\ObjectA', PHP_EOL; } }
咱們定義了一個file1-1.php,而且使用了和file1.php相同的FILE1命名空間。而後和file1.php一塊兒include到測試代碼中。spa
include 'namespace/file1.php'; include 'namespace/file1-1.php'; // Cannot redeclare FILE1\testA()
好吧,在運行時直接就報錯,不能重複定義同名的函數名。若是註釋掉函數,那麼會繼續報類名不能重複。咱們再定義一個file1-2.php,此次仍是使用FILE1這個命名空間,可是內容不同了。
// file1-2.php namespace FILE1; const CONST_A = 1.2; function testA1_2(){ echo 'FILE1-2\testA()', PHP_EOL; } class objectA1_2{ function test(){ echo 'FILE1-2\ObjectA', PHP_EOL; } }
這樣固然就沒問題啦。這兩個文件在同一個命名空間下,可是卻有着不一樣的能力,這樣是徹底OK的操做。
include 'namespace/file1.php'; include 'namespace/file1-2.php'; use FILE1; // FILE1 echo FILE1\CONST_A, PHP_EOL; // 2 FILE1\testA(); // FILE1\testA() $oA = new FILE1\objectA(); $oA->test(); // FILE1\ObjectA // FILE1_2 echo FILE1\CONST_A, PHP_EOL; // 3 FILE1\testA1_2(); // FILE1-2\testA() $oA = new FILE1\objectA1_2(); $oA->test(); // FILE1-2\ObjectA
參考文檔:
https://www.php.net/manual/zh/language.namespaces.rationale.php
https://www.php.net/manual/zh/language.namespaces.definition.php
===============
關注公衆號:【硬核項目經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料
知乎、公衆號、抖音、頭條搜索【硬核項目經理】
B站ID:482780532