溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中什么是命名空間有什么用

發(fā)布時間:2020-07-18 09:32:36 來源:億速云 閱讀:233 作者:清晨 欄目:編程語言

小編給大家分享一下PHP中什么是命名空間有什么用,相信大部分人都還不怎么了解,因此分享這邊文章給大家學(xué)習(xí),希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學(xué)習(xí)方法吧!

1、什么是命名空間

如果你只需要知道現(xiàn)代PHP特性中的一個,那就應(yīng)該是命名空間。命名空間在PHP5.3.0中引入,其作用是按照一種虛擬的層次結(jié)構(gòu)組織PHP代碼,這種層次結(jié)構(gòu)類似操作系統(tǒng)中文件系統(tǒng)的目錄結(jié)構(gòu)。

命名空間是現(xiàn)代PHP組件生態(tài)的基礎(chǔ),現(xiàn)代的PHP組件框架代碼都是放在各自全局唯一的廠商命名空間中,以免和其他廠商使用的常見類名沖突。

下面我來看看真實的PHP組件是如何使用命名空間的。Laravel框架中的Http組件用于管理HTTP請求和響應(yīng),這個組件用到了常見的類名,例如Request、Response,很多其他PHP組件也用到了這樣的類名,既然其他PHP代碼也用到了相同的類名,那怎么使用這個組件呢?

其實我們可以放心使用,因為這個組件的代碼放在了唯一的廠商命名空間Illuminate中。

打開這個組件在GitHub中的倉庫(https://github.com/laravel/framework/blob/master/src/Illuminate/Http/Response.php),找到Response.php文件:

PHP中什么是命名空間有什么用

第3行代碼如下:

namespace Illuminate\Http;

這一行是PHP命名空間聲明語句,聲明命名空間的代碼始終應(yīng)該放在<?php標(biāo)簽后的第一行。通過這個命名空間的聲明語句我們可以看到Response位于廠商命名空間Illuminate中(最頂層命名空間),我們還看到Response類在子命名空間Http中,你可以看下和Response.php文件在同一層級的其他文件,會發(fā)現(xiàn)它們都使用相同的命名空間聲明語句。

命名空間的作用是封裝和組織相關(guān)的PHP類,就像在文件系統(tǒng)中把相關(guān)的文件放在同一個目錄中一樣。PHP命名空間和操作系統(tǒng)的物理文件系統(tǒng)不同,這是一個虛擬概念,沒必要和文件系統(tǒng)中的目錄結(jié)構(gòu)完全相同,雖然如此,但是大多數(shù)PHP組件為了兼容廣泛使用的PSR-4自動加載標(biāo)準(zhǔn),會把命名空間放到對應(yīng)文件系統(tǒng)的子目錄中。

2、為什么使用命名空間

前面已經(jīng)提到過,我們的代碼可能和其他開發(fā)者的代碼使用相同的類名、接口名、函數(shù)或常量名,如果不使用命名空間,名稱會起沖突,導(dǎo)致PHP執(zhí)行出錯。而使用命名空間將代碼放到唯一的廠商命名空間,我們的代碼就可以和其他開發(fā)者使用相同的類名、接口名、函數(shù)或常量名。

當(dāng)然如果你開發(fā)的是小型個人項目,只有少量的依賴,類名沖突可能不是問題,但是如果在團隊中工作,開發(fā)用到許多第三方依賴的大型項目,就要認真對待命名沖突問題,因為你無法控制項目依賴在全局命名空間中引入的類、接口、函數(shù)和常量,這也是為什么要使用命名空間的原因。

3、聲明命名空間

每個PHP類、接口、函數(shù)和常量都在命名空間中,聲明命名空間很簡單,在<?php標(biāo)簽后的第一行聲明,聲明語句以namespace開頭,隨后是一個空格,然后是命名空間的名稱,最后以;結(jié)尾。

命名空間經(jīng)常用于設(shè)置頂層廠商名,比如我們設(shè)置廠商名為LaravelAcademy

<?php
   namespace LaravelAcademy;

在這個命名空間聲明語句后聲明的所有PHP類、接口、函數(shù)和常量都在LaravelAcademy命名空間中,而且和Laravel學(xué)院有某種關(guān)系。如果我們想組織學(xué)院用到的代碼該怎么做呢?答案是使用子命名空間。

子命名空間的聲明方式和前面的示例完全一樣,唯一的區(qū)別是我們要使用\符號把命名空間和子命名空間分開,例如:

<?php
   namespace LaravelAcademy\ModernPHP;

這個命名空間后的所有類、接口、函數(shù)和常量都位于LaravelAcademy\ModernPHP中。在同一個命名空間中的類沒必要在同一個PHP文件中聲明,可以在PHP文件的頂部指定一個命名空間或子命名空間,此時,這個文件的代碼就是該命名空間或子命名空間的一部分。因此我們可以在不同文件中編寫屬于同一個命名空間的多個類。

注:廠商命名空間是最頂層的命名空間,也是最重要的命名空間,用于識別品牌或組織,必須具有全局唯一性。子命名空間相對而言沒那么重要,但是可以用于組織項目的代碼。

4、導(dǎo)入和別名

在命名空間出現(xiàn)之前,PHP開發(fā)者使用Zend風(fēng)格的類名解決命名沖突問題,這是一種類的命名方案,因Zend框架而流行,這種命名方案在PHP類名中使用下劃線的方式表示文件系統(tǒng)的目錄分隔符。這種約定有兩個作用:其一,確保類名是唯一的;其二,原生的自動加載器會把類名中的下劃線替換成文件系統(tǒng)的目錄分隔符,從而確定文件的路徑。例如,Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query類對應(yīng)的文件是Zend/Cloud/DocumentService/Adapter/WindowsAzure/Query.php。可以看出,這種命名有個缺點:類名特別長。

現(xiàn)代的PHP命名空間也有這個問題,例如上述Response類完整的全名是Illuminate\Http\Response,幸好,我們可以通過導(dǎo)入以及創(chuàng)建別名的方式來改變這一狀況。

導(dǎo)入的意思是指,在每個PHP文件中告訴PHP想使用哪個命名空間、類、接口、函數(shù)和常量,導(dǎo)入后就不用使用全名了:

  <?php
    use Illuminate\Http\Response;

    $response = new Response(‘Oops’, 400);
    $response->send();

我們通過use關(guān)鍵字告訴PHP,我們想使用Illuminate\Http\Response類,我們只需要輸入一次完全限定的類名,隨后實例化Response的時候,無需使用完整的類名。

如果覺得這樣的類名還是長,可以創(chuàng)建別名。創(chuàng)建別名指的是告訴PHP我要使用簡單的名稱引用導(dǎo)入的類、接口、函數(shù)或常量:

   <?php

    use Illuminate\Http\Response as Res;

    $res = new Res(‘Oops’, 400);
    $res->send();

從PHP 5.6開始還可以導(dǎo)入函數(shù)和常量,不過要調(diào)整use關(guān)鍵字的句法,如果要導(dǎo)入函數(shù),需要使用use func

  <?php
    use func Namespace\functionName

    functionName();

如果想導(dǎo)入常量,可以使用use constant

  <?php
    use constant Namespace\CONST_NAME;

    echo CONST_NAME;

當(dāng)然也支持別名,創(chuàng)建方式和類一樣。

5、實用技巧

多重導(dǎo)入

如果想要在PHP文件中導(dǎo)入多個類、接口、函數(shù)或常量,需要在PHP文件的頂部使用多個use語句,PHP支持用簡短的語法把多個use語句寫成一行:

  <?php
    use Illuminate\Http\Request,
    Illuminate\Http\Response;

但是為了可讀性,建議不要這么寫,還是一行寫一個use語句比較好:

  <?php
    use Illuminate\Http\Request;
    use Illuminate\Http\Response;

一個文件使用多個命名空間

PHP允許在一個文件中定義多個命名空間:

<?php
    namespace Foo {
      //聲明類、接口、函數(shù)、常量
    }

    namespace Bar {
      //聲明類、接口、函數(shù)、常量
    }

但這么做不好,違背了“一個文件一個類”的良好實踐,因此不建議這么做。

全局命名空間

如果引用的類、接口、函數(shù)和常量沒有指定命名空間,PHP假定引用的類、接口、函數(shù)和常量在當(dāng)前的命名空間中。如果要使用其他命名空間的類、接口、函數(shù)或常量,需要使用完全限定的PHP類名(命名空間+類名)。

有些代碼在全局命名空間中,沒有命名空間,比如原生的Exception類就是這樣。在命名空間中引用全局的代碼時,需要在類、接口、函數(shù)或常量前加\符號:

<?php
    namespace My\App;

    class Foo {
      public function doSomething() {
         throw new \Exception();
      }
    }

自動加載

命名空間還為PHP-FIG制定的PSR-4自動加載標(biāo)準(zhǔn)奠定了堅實的基礎(chǔ),大多數(shù)現(xiàn)代的PHP組件都使用了這種自動加載模式,使用依賴管理器Composer可以自動加載項目的依賴,后續(xù)我們還會詳細介紹Composer和PHP-FIG,現(xiàn)在你只需要知道沒有命名空間,就沒有現(xiàn)代的PHP生態(tài)系統(tǒng)和基于組件的新型架構(gòu),由此可見命名空間的重要性。

以上是PHP中什么是命名空間有什么用的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI