PHP手冊:從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。
命名空間的作用1.用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
2.為很長的標(biāo)識符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個別名(或簡短)的名稱,提高源代碼的可讀性。
寫這個命名空間的文章是因為一個朋友剛學(xué)這個來問我命名空間到底是個什么東西。我在想怎么簡單的描述出來并且很容易理解。下面我就以幾個簡單的小例子來說明一下我自己對命名空間的理解。
1. 例一
首先我們先建立兩個類文件
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."; }}
再建立一個index.php文件,來引入以上兩個類并調(diào)用其中的方法。
index.php
require_once("a.php");require_once("b.php");
現(xiàn)在運行index.php文件,你會發(fā)現(xiàn)有一個致命錯誤: Fatal error: Cannot redeclare class Test in。。。很顯然,無法重新聲明Test類,因為你引入了兩次,而且兩個文件中的類名稱相同,沖突了。這個時候就需要命名空間來解決這個問題,并且很容易。
2. 例二
我們現(xiàn)在把兩個類文件稍作修改。
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)鍵字是用來聲明命名空間的。現(xiàn)在運行index.php發(fā)現(xiàn)沒有錯誤,修改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)在有另外一種情況,比如我需要實例化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.
雖然也沒有錯誤,但是你會發(fā)現(xiàn)比較麻煩,每次都需要全寫命名空間名稱,雖然不報錯并且可以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)鍵字是用來引入類,用命名空間的方式表示使用了某個類。后面就可以直接實例化操作
4. 例五
接下來另一個問題又來了,如下:
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();
很明顯,又一個致命錯誤:Fatal error: Cannot use b/test/Test as Test because the name is already in use in 。。。因為雖然使用了命名空間,但是兩個類名稱相同,都是Test,程序不知道第二個Test類是b.php中的Test類,這時候你就用到了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)鍵字是對類名稱定義別名,可以有效防止類名稱相同沖突
5. 例六
下面是另一種情況,我先給出幾個代碼片段,是Yii2框架中的,和框架無關(guān),只是為了演示使用,很多地方都能見到此例。
if (/Yii::$app->request->isPost) { $post = /Yii::$app->request->post(); ... }
很顯然這里使用了一個Yii類,但是為什么前面又一個反斜杠”/”,我們先追蹤一下Yii類,有的同學(xué)會問怎么追蹤呢,如果你使用的是PHPstorm編輯器,直接按住Ctrl,鼠標(biāo)點擊類名就會跳到此類類文件中,關(guān)于怎么使用PHPstorm編輯器,請查看: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{}
你會發(fā)現(xiàn)該Yii類并沒有命名空間,我們將這種類叫做全局類,如果要使用需要類前面加入反斜杠”/”
比如我們在a.php同級再建立一個全局類文件: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手冊:從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。
命名空間的作用1.用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
2.為很長的標(biāo)識符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個別名(或簡短)的名稱,提高源代碼的可讀性。
寫這個命名空間的文章是因為一個朋友剛學(xué)這個來問我命名空間到底是個什么東西。我在想怎么簡單的描述出來并且很容易理解。下面我就以幾個簡單的小例子來說明一下我自己對命名空間的理解。
1. 例一
首先我們先建立兩個類文件
a.php
class Test{ public function test() { echo "this is A class."; }}
b.php
class Test{ public function test() { echo "this is B class."; }}
再建立一個index.php文件,來引入以上兩個類并調(diào)用其中的方法。
index.php
require_once("a.php");require_once("b.php");
現(xiàn)在運行index.php文件,你會發(fā)現(xiàn)有一個致命錯誤: Fatal error: Cannot redeclare class Test in。。。很顯然,無法重新聲明Test類,因為你引入了兩次,而且兩個文件中的類名稱相同,沖突了。這個時候就需要命名空間來解決這個問題,并且很容易。
2. 例二
我們現(xiàn)在把兩個類文件稍作修改。
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)在運行index.php發(fā)現(xiàn)沒有錯誤,修改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)在有另外一種情況,比如我需要實例化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.
雖然也沒有錯誤,但是你會發(fā)現(xiàn)比較麻煩,每次都需要全寫命名空間名稱,雖然不報錯并且可以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)鍵字是用來引入類,用命名空間的方式表示使用了某個類。后面就可以直接實例化操作
4. 例五
接下來另一個問題又來了,如下:
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();
很明顯,又一個致命錯誤:Fatal error: Cannot use b/test/Test as Test because the name is already in use in 。。。因為雖然使用了命名空間,但是兩個類名稱相同,都是Test,程序不知道第二個Test類是b.php中的Test類,這時候你就用到了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)鍵字是對類名稱定義別名,可以有效防止類名稱相同沖突
5. 例六
下面是另一種情況,我先給出幾個代碼片段,是Yii2框架中的,和框架無關(guān),只是為了演示使用,很多地方都能見到此例。
if (/Yii::$app->request->isPost) { $post = /Yii::$app->request->post(); ... }
很顯然這里使用了一個Yii類,但是為什么前面又一個反斜杠”/”,我們先追蹤一下Yii類,有的同學(xué)會問怎么追蹤呢,如果你使用的是PHPstorm編輯器,直接按住Ctrl,鼠標(biāo)點擊類名就會跳到此類類文件中,關(guān)于怎么使用PHPstorm編輯器,請查看: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{}
你會發(fā)現(xiàn)該Yii類并沒有命名空間,我們將這種類叫做全局類,如果要使用需要類前面加入反斜杠”/”
比如我們在a.php同級再建立一個全局類文件: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)容,更多請關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選