PHP 命名空間詳解 以ThinkPHP舉例

2021-07-08 20:01:02 字數 4228 閱讀 3549

摘要:學習tp,要涉及到php命名空間的問題,特將學習過程記錄如下,給同樣入門tp的人鋪點路。

寫在最前面的廢話,學習php,從最初在乙個指令碼裡寫出echo 「hello world」,到後來需要用include require引入檔案來完成中大型專案,當include的檔案相當多的時候,函式、類、常量的命名就成了問題,有可能在不同的檔案建立相同的函式名,當include進同乙個檔案的時候,php就會出錯。php使用命名空間的方法來解決這個問題。

php官網對此做了詳細講解:點這裡檢視

官網解釋非常詳細,不過你如果也是入門tp,第一次接觸命名空間,先看看我自己總結的辦法,也許會有幫助。

先上**,index.php是我的主檔案,裡面引用了test.php,兩個檔案同級。

這是index.php

<?php

include

'test.php';

function

test

()test();

?>

這是test.php

<?php

function

test

()?>

這樣引用會導致嚴重錯誤,因為php解釋include語句是替換test.php這個檔案進如index.php,很明顯乙個指令碼了裡面有兩個同名的函式,嚴重錯誤!

首先,什麼是命名空間,它的作用像是在幹什麼?

答:php官網上面舉這個例子非常好,說我們在檔案系統裡面放置檔案的時候,都知道乙個資料夾裡面不能出現兩個同名的檔案,但是兩個同名的檔案可以放在不同的資料夾下正常使用,因為使用這兩個檔案的時候,分別有乙個絕對路徑的位址對他們做了區分。命名空間的原理和它類似,當在專案中為乙個檔案宣告了命令空間,意思就是,這個檔案裡面的類名、函式名、常量名(都稱為元素)是屬於這個命名空間(資料夾)的,命令空間可以宣告為多層,這樣**之間就會相互隔離,起到了封裝的作用。

再來看**

index.php

namespace

index;

include

'test.php';

function

test

()test(); //這樣就呼叫自己命名空間的test函式

test\test(); //這樣就呼叫了test.php指令碼,index\test命名空間下的test函式

test.php

namespace

index\test;

function

test

()

先用上面的**做下解釋,有個主觀感受:在檔案開頭,宣告namespace,就像是在宣告這個檔案裡的元素所在的「資料夾」,index.php裡面的元素位於index命名空間下,test.php裡面的元素位於index資料夾下的test資料夾下。那麼在index.php檔案裡面要呼叫test.php裡面的函式的時候,就需要在index命名空間下使用相對路徑test\test();來引用。

首先還要了解一下:php命名空間元素使用的三種方法:

1.非限定名稱,或不包含字首的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的**是全域性的,不包含在任何命名空間中的**,則 foo 會被解析為foo。 警告:如果命名空間中的函式或常量未定義,則該非限定的函式名稱或常量名稱會被解析為全域性函式名稱或常量名稱。詳情參見 使用命名空間:後備全域性函式名稱/常量名稱。

2.限定名稱,或包含字首的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的**是全域性的,不包含在任何命名空間中的**,foo 會被解析為subnamespace\foo。

3.完全限定名稱,或包含了全域性字首操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析為**中的文字名(literal name)currentnamespace\foo。

下面還是用**來說明最常用的語法規則

<?php

namespace

article;

const path = '/article';

function

getcommenttotal

() class

comment

namespace

messageboard;

const path = '/message_board';

function

getcommenttotal

() class

comment

//呼叫當前空間的常量、函式和類

echo path; ///message_board

echo getcommenttotal(); //300

$comment = new comment();

//呼叫article空間的常量、函式和類

echo \article\path; ///article

echo \article\getcommenttotal(); //100

$article_comment = new \article\comment();

?>

說明:這裡呼叫article空間的元素,使用的就是完全限定名稱。

別名和匯入(很重要)

上**,然後解釋**

<?php

namespace

blog\article;

class

comment

//建立乙個bbs空間

namespace

bbs;

//匯入乙個命名空間

useblog\article;

//匯入命名空間後可使用限定名稱呼叫元素

$article_comment = new article\comment();

//為命名空間使用別名

useblog\article

asarte;

//使用別名代替空間名

$article_comment = new arte\comment();

//匯入乙個類

useblog\article\comment;

//匯入類後可使用非限定名稱呼叫元素

$article_comment = new comment();

//為類使用別名

useblog\article\comment

ascomt;

//使用別名代替空間名

$article_comment = new comt();

?>

說明:匯入命名空間,可以理解為,將要匯入的空間複製到當前空間下。

即將blog\article這個資料夾複製到bbs資料夾下,那麼在bbs空間下,就可以使用限定名稱的方式呼叫article下的元素了。

或者可以直接匯入空間裡面的類元素,注意這裡:php5.6之前的版本只能引入類元素,5.6之後可以引入常量和函式。

當直接匯入了類以後,就可以直接使用非限定名稱來呼叫元素了,非常方便!

thinkphp版本號:3.2.3

當第一次啟動tp後,php會自動建立home模組,以及子目錄

<?php

namespace

home\controller;

usethink\controller;

class

indexcontroller

extends

controller

}?>

這裡就引用了think命名空間下的controller類

這個類的位置在:

/thinkphp/library/think/controller.class.php

這個檔案裡面就使用了

namespace think;

《完》

php 命名空間詳解

test1.php 的內容如下 class test test2.php 的內容如下 class test index.php 的內容如下 php提示我們不能宣告 test2.php 的 test類 這是為什麼呢 其實是因為 test2.php 中的 test類 和 test1.php 中的類重名了...

php中命名空間詳解

一 定義命名空間 命名空間主要針對 類,函式和常量,因為他們的作用域是全域性的,產生命名衝突的可能性很大 1.關鍵字 namespace 作用 1.定義命名空間 2.顯示的訪問當前命名空間,類似於self 2.常量 namespace 當前命名空間字串,全域性為空字元 3.宣告空間前不宜有除了dec...

詳解PHP中的命名空間

命名空間其實早在php5.3就已經出現了。不過大部分同kierr學可能在各種框架的使用中才會接觸到命名空間的內容,當然,現代化的開發也都離不開這些能夠快速產出的框架。這次我們不從框架的角度,僅從簡單的 角度來解析一下命名空間的概念和使用。首先,我們要定義命名空間是個什麼東西。其實就像作業系統的目錄一...