PHP手冊(cè):從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對(duì)于目錄中的文件來說,它就扮演了命名空間的角色。
命名空間的作用1.用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
2.為很長的標(biāo)識(shí)符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個(gè)別名(或簡短)的名稱,提高源代碼的可讀性。
寫這個(gè)命名空間的文章是因?yàn)橐粋€(gè)朋友剛學(xué)這個(gè)來問我命名空間到底是個(gè)什么東西。我在想怎么簡單的描述出來并且很容易理解。下面我就以幾個(gè)簡單的小例子來說明一下我自己對(duì)命名空間的理解。
1. 例一
首先我們先建立兩個(gè)類文件
a.php
html' target='_blank'>class Test{ public function test() { echo "this is A class."; }}
b.php
class Test{ public function test() { echo "this is B class."; }}再建立一個(gè)index.php文件,來引入以上兩個(gè)類并調(diào)用其中的方法。
index.php
require_once("a.php");require_once("b.php");現(xiàn)在運(yùn)行index.php文件,你會(huì)發(fā)現(xiàn)有一個(gè)致命錯(cuò)誤: Fatal error: Cannot redeclare class Test in。。。很顯然,無法重新聲明Test類,因?yàn)槟阋肓藘纱危覂蓚€(gè)文件中的類名稱相同,沖突了。這個(gè)時(shí)候就需要命名空間來解決這個(gè)問題,并且很容易。
2. 例二
我們現(xiàn)在把兩個(gè)類文件稍作修改。
a.php
namespace a/test;class Test{ public function test() { echo "this is A class."; }}b.php
namespace b/test;class Test{ public function test() { echo "this is B class."; }}namespace關(guān)鍵字是用來聲明命名空間的?,F(xiàn)在運(yùn)行index.php發(fā)現(xiàn)沒有錯(cuò)誤,修改index.php進(jìn)行方法調(diào)用測試
index.php
require_once("a.php");require_once("b.php");$a = new a/test/Test();$a->test();//頁面輸出:this is A class.3. 例三
現(xiàn)在有另外一種情況,比如我需要實(shí)例化a.php中的Test類多次,那么每次我們都需要命名空間信息完整寫的話比較麻煩怎么辦呢?比如:
index.php
require_once("a.php");require_once("b.php");$a = new a/test/Test();$a_a = new a/test/Test();$a_b = new a/test/Test();$a->test();$a_a->test();//頁面輸出:this is A class.this is A class.雖然也沒有錯(cuò)誤,但是你會(huì)發(fā)現(xiàn)比較麻煩,每次都需要全寫命名空間名稱,雖然不報(bào)錯(cuò)并且可以ctrl+c,ctrl+v,但是不太美觀(^_^)。
你可以這樣做:
index.php
require_once("a.php");require_once("b.php");use a/test/Test;$a = new Test();$a_a = new Test();$a_b = new Test();$a->test();$a_a->test();//頁面輸出:this is A class.this is A class.use關(guān)鍵字是用來引入類,用命名空間的方式表示使用了某個(gè)類。后面就可以直接實(shí)例化操作
4. 例五
接下來另一個(gè)問題又來了,如下:
index.php
require_once("a.php");require_once("b.php");use a/test/Test;use b/test/Test;$a = new Test();$b = new Test();$a->test();$b->test();很明顯,又一個(gè)致命錯(cuò)誤:Fatal error: Cannot use b/test/Test as Test because the name is already in use in 。。。因?yàn)殡m然使用了命名空間,但是兩個(gè)類名稱相同,都是Test,程序不知道第二個(gè)Test類是b.php中的Test類,這時(shí)候你就用到了as關(guān)鍵字
如:
index.php
require_once("a.php");require_once("b.php");use a/test/Test;use b/test/Test as BTest;$a = new Test();$b = new BTest();$a->test();$b->test();//頁面輸出:this is A class.this is B class.完美解決as關(guān)鍵字是對(duì)類名稱定義別名,可以有效防止類名稱相同沖突
5. 例六
下面是另一種情況,我先給出幾個(gè)代碼片段,是Yii2框架中的,和框架無關(guān),只是為了演示使用,很多地方都能見到此例。
if (/Yii::$app->request->isPost) { $post = /Yii::$app->request->post(); ... }很顯然這里使用了一個(gè)Yii類,但是為什么前面又一個(gè)反斜杠”/”,我們先追蹤一下Yii類,有的同學(xué)會(huì)問怎么追蹤呢,如果你使用的是PHPstorm編輯器,直接按住Ctrl,鼠標(biāo)點(diǎn)擊類名就會(huì)跳到此類類文件中,關(guān)于怎么使用PHPstorm編輯器,請(qǐng)查看:PhpStorm破解版及使用教程
下面是Yii類文件代碼段:
/** * Yii bootstrap file. * * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */require(__DIR__ . '/BaseYii.php');class Yii extends /yii/BaseYii{}你會(huì)發(fā)現(xiàn)該Yii類并沒有命名空間,我們將這種類叫做全局類,如果要使用需要類前面加入反斜杠”/”
比如我們?cè)赼.php同級(jí)再建立一個(gè)全局類文件:c.php:
class Test{ public function test() { echo "this is C class."; }}在index.php文件中這樣做即可調(diào)用c.php中的test方法
require_once("a.php");require_once("b.php");require_once("c.php");use a/test/Test;use b/test/Test as BTest;$a = new Test();$b = new BTest();$c = new /Test();$a->test();$b->test();$c->test();//頁面輸出:this is C class.this is A class.this is B class.this is C class.注意:namespace,use,as等關(guān)鍵字用法以及全局類的使用。
什么是PHP命名空間PHP手冊(cè):從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對(duì)于目錄中的文件來說,它就扮演了命名空間的角色。
命名空間的作用1.用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
2.為很長的標(biāo)識(shí)符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個(gè)別名(或簡短)的名稱,提高源代碼的可讀性。
寫這個(gè)命名空間的文章是因?yàn)橐粋€(gè)朋友剛學(xué)這個(gè)來問我命名空間到底是個(gè)什么東西。我在想怎么簡單的描述出來并且很容易理解。下面我就以幾個(gè)簡單的小例子來說明一下我自己對(duì)命名空間的理解。
1. 例一
首先我們先建立兩個(gè)類文件
a.php
class Test{ public function test() { echo "this is A class."; }}b.php
class Test{ public function test() { echo "this is B class."; }}再建立一個(gè)index.php文件,來引入以上兩個(gè)類并調(diào)用其中的方法。
index.php
require_once("a.php");require_once("b.php");現(xiàn)在運(yùn)行index.php文件,你會(huì)發(fā)現(xiàn)有一個(gè)致命錯(cuò)誤: Fatal error: Cannot redeclare class Test in。。。很顯然,無法重新聲明Test類,因?yàn)槟阋肓藘纱?,而且兩個(gè)文件中的類名稱相同,沖突了。這個(gè)時(shí)候就需要命名空間來解決這個(gè)問題,并且很容易。
2. 例二
我們現(xiàn)在把兩個(gè)類文件稍作修改。
a.php
namespace a/test;class Test{ public function test() { echo "this is A class."; }}b.php
namespace b/test;class Test{ public function test() { echo "this is B class."; }}namespace關(guān)鍵字是用來聲明命名空間的?,F(xiàn)在運(yùn)行index.php發(fā)現(xiàn)沒有錯(cuò)誤,修改index.php進(jìn)行方法調(diào)用測試
index.php
require_once("a.php");require_once("b.php");$a = new a/test/Test();$a->test();//頁面輸出:this is A class.3. 例三
現(xiàn)在有另外一種情況,比如我需要實(shí)例化a.php中的Test類多次,那么每次我們都需要命名空間信息完整寫的話比較麻煩怎么辦呢?比如:
index.php
require_once("a.php");require_once("b.php");$a = new a/test/Test();$a_a = new a/test/Test();$a_b = new a/test/Test();$a->test();$a_a->test();//頁面輸出:this is A class.this is A class.雖然也沒有錯(cuò)誤,但是你會(huì)發(fā)現(xiàn)比較麻煩,每次都需要全寫命名空間名稱,雖然不報(bào)錯(cuò)并且可以ctrl+c,ctrl+v,但是不太美觀(^_^)。
你可以這樣做:
index.php
require_once("a.php");require_once("b.php");use a/test/Test;$a = new Test();$a_a = new Test();$a_b = new Test();$a->test();$a_a->test();//頁面輸出:this is A class.this is A class.use關(guān)鍵字是用來引入類,用命名空間的方式表示使用了某個(gè)類。后面就可以直接實(shí)例化操作
4. 例五
接下來另一個(gè)問題又來了,如下:
index.php
require_once("a.php");require_once("b.php");use a/test/Test;use b/test/Test;$a = new Test();$b = new Test();$a->test();$b->test();很明顯,又一個(gè)致命錯(cuò)誤:Fatal error: Cannot use b/test/Test as Test because the name is already in use in 。。。因?yàn)殡m然使用了命名空間,但是兩個(gè)類名稱相同,都是Test,程序不知道第二個(gè)Test類是b.php中的Test類,這時(shí)候你就用到了as關(guān)鍵字
如:
index.php
require_once("a.php");require_once("b.php");use a/test/Test;use b/test/Test as BTest;$a = new Test();$b = new BTest();$a->test();$b->test();//頁面輸出:this is A class.this is B class.完美解決as關(guān)鍵字是對(duì)類名稱定義別名,可以有效防止類名稱相同沖突
5. 例六
下面是另一種情況,我先給出幾個(gè)代碼片段,是Yii2框架中的,和框架無關(guān),只是為了演示使用,很多地方都能見到此例。
if (/Yii::$app->request->isPost) { $post = /Yii::$app->request->post(); ... }很顯然這里使用了一個(gè)Yii類,但是為什么前面又一個(gè)反斜杠”/”,我們先追蹤一下Yii類,有的同學(xué)會(huì)問怎么追蹤呢,如果你使用的是PHPstorm編輯器,直接按住Ctrl,鼠標(biāo)點(diǎn)擊類名就會(huì)跳到此類類文件中,關(guān)于怎么使用PHPstorm編輯器,請(qǐng)查看:PhpStorm破解版及使用教程
下面是Yii類文件代碼段:
/** * Yii bootstrap file. * * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */require(__DIR__ . '/BaseYii.php');class Yii extends /yii/BaseYii{}你會(huì)發(fā)現(xiàn)該Yii類并沒有命名空間,我們將這種類叫做全局類,如果要使用需要類前面加入反斜杠”/”
比如我們?cè)赼.php同級(jí)再建立一個(gè)全局類文件:c.php:
class Test{ public function test() { echo "this is C class."; }}在index.php文件中這樣做即可調(diào)用c.php中的test方法
require_once("a.php");require_once("b.php");require_once("c.php");use a/test/Test;use b/test/Test as BTest;$a = new Test();$b = new BTest();$c = new /Test();$a->test();$b->test();$c->test();//頁面輸出:this is C class.this is A class.this is B class.this is C class.注意:namespace,use,as等關(guān)鍵字用法以及全局類的使用。
以上就是關(guān)于PHP的命名空間 的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選