国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

關(guān)于PHP的命名空間

2020-03-24 18:12:47
字體:
供稿:網(wǎng)友
這篇文章介紹的內(nèi)容是關(guān)于PHP的命名空間 ,有著一定的參考價值,現(xiàn)在分享給大家,有需要的朋友可以參考一下

什么是PHP命名空間

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)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 砚山县| 曲靖市| 华亭县| 邯郸市| 江川县| 济南市| 胶南市| 高陵县| 乾安县| 乃东县| 广汉市| 邓州市| 金堂县| 河南省| 鄂伦春自治旗| 桑日县| 镇康县| 葵青区| 兴安县| 沙洋县| 兰溪市| 南城县| 交口县| 钦州市| 瑞安市| 阜南县| 微博| 深圳市| 怀仁县| 剑川县| 松江区| 象山县| 怀远县| 昌邑市| 张家港市| 故城县| 铜鼓县| 壶关县| 饶平县| 祁连县| 陇南市|