命名空間其實早在php5.3就已經出現了。不過大部分同kierr學可能在各種框架的使用中才會接觸到命名空間的內容,當然,現代化的開發也都離不開這些能夠快速產出的框架。這次我們不從框架的角度,僅從簡單的**角度來解析一下命名空間的概念和使用。
首先,我們要定義命名空間是個什麼東西。
其實就像作業系統的目錄一樣,命名空間就是為了解決類似於作業系統中同乙個資料夾不能有相同的檔名一樣的問題。假設我們只有乙個檔案,乙個目錄,那麼在這個目錄中,是不能有兩個完全相同的檔案的。如果有這樣名稱完全相同的檔案,那麼作業系統也不知道我們到底應該開啟的是哪乙個檔案。同理,在乙個php檔案中,我們也不能起相同名稱的函式或者類名,php也不知道我們到底要呼叫的是哪乙個函式或者類。
理解了上述內容之後,再來看命名空間的語法,其實非常像我們的目錄的定義。
namespace a\b\c;
這個命名空間的定義就是指出了當前命名空間是a\b\c。就像是c:\a\b\c這樣乙個資料夾一樣。光說不練假把式,直接上**來看看:
// file1.php
namespace file1;
const const_a = 2;
function testa()
class objecta
}// file2.php
namespace file2;
const const_a = 3;
function testa()
class objecta
}我們在namespace目錄下建立了這兩個php檔案,函式和類名都是一樣的,但定義了不同的命名空間,乙個是file1,乙個是file2。
namespace a;
include 'namespace/file1.php';
include 'namespace/file2.php';
use file1, fi程式設計客棧le2;
use file1\objecta as objectb;
const const_a = 1;
function testa()
class objecta
}// 當前命名空間
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-&gkierrt;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()
class objecta
}我們定義了乙個file1-1.php,並且使用了和file1.php相同的file1命名空間。然後和file1.php一起include到測試**中。
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()
class objecta1_2
}這樣當然就沒問題啦。這兩個檔案在同乙個命名空間下,但是卻有著不同的能力,這樣是完全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
測試**: github.com/zhangyue050…
php中命名空間詳解
一 定義命名空間 命名空間主要針對 類,函式和常量,因為他們的作用域是全域性的,產生命名衝突的可能性很大 1.關鍵字 namespace 作用 1.定義命名空間 2.顯示的訪問當前命名空間,類似於self 2.常量 namespace 當前命名空間字串,全域性為空字元 3.宣告空間前不宜有除了dec...
php 命名空間詳解
test1.php 的內容如下 class test test2.php 的內容如下 class test index.php 的內容如下 php提示我們不能宣告 test2.php 的 test類 這是為什麼呢 其實是因為 test2.php 中的 test類 和 test1.php 中的類重名了...
PHP中命名空間不足之詳解
首先,還是簡單了解一下命名空間,定義命名空間使用namespace,引用命名空間使用use。如果在定義乙個函式或是定義乙個類的時候,不新增命名空間,預設的在根命名空間,根命名空間使用 表示,在例項化物件的時候,如果不新增命名空間,代表實力化當前命名空間中的類。class student functi...