PHP的命名空間的介紹

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP的命名空間,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

什麼是PHP命名空間?

(PHP 5 >= 5.3.0, PHP 7)

什麼是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在作業系統中目錄用來將相關檔案分組,對於目錄中的檔案來說,它就扮演了命名空間的角色。具體舉個例子,檔案 foo.txt 可以同時在目錄/home/greg/home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 檔案。另外,在目錄 /home/greg 外訪問 foo.txt 檔案時,我們必須將目錄名以及目錄分隔字元放在檔案名稱之前得到 /home/greg/foo.txt。這個原理應用到程式設計領域就是命名空間的概念。

在PHP中,命名空間用來解決在編寫類庫或應用程式時建立可重用的代碼如類或函數時碰到的兩類問題:

  1. 使用者編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。

  2. 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。

雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,它們是:類(包括抽象類別和traits)、介面、函數和常量。

命名空間通過關鍵字namespace 來聲明。如果一個檔案中包含命名空間,它必須在其它所有代碼之前聲明命名空間,除了一個以外:declare關鍵字。

在聲明命名空間之前唯一合法的代碼是用於定義源檔案編碼方式的 declare 語句。另外,所有非 PHP 程式碼封裝括空白符都不能出現在命名空間的聲明之前:

<html><?phpnamespace MyProject; // 致命錯誤 - 命名空間必須是程式指令碼的第一條語句?>

另外,與PHP其它的語言特徵不同,同一個命名空間可以定義在多個檔案中,即允許將同一個命名空間的內容分割存放在不同的檔案中。

1. 例一
首先我們先建立兩個類檔案

a.php

<?phpclass Test{    public function ceshi(){        echo __FILE__;    }}

b.php

<?phpclass Test{    public function ceshi(){        echo __FILE__;    }}

index.php

<?phprequire_once("a.php");require_once("b.php");

現在運行index.php檔案

你會發現有一個致命錯誤: Fatal error: Cannot redeclare class Test in。。。很顯然,無法重新聲明Test類,因為你引入了兩次,而且兩個檔案中的類名稱相同,衝突了。這個時候就需要命名空間來解決這個問題,並且很容易。

2. 例二
我們現在把兩個類檔案稍作修改。

a.php

<?phpnamespace demo1\a\Test;class Test{    public function ceshi(){        echo __FILE__;    }}

b.php

<?phpnamespace demo1\b\Test;class Test{    public function ceshi(){        echo __FILE__;    }}

namespace關鍵字是用來聲明命名空間的。現在運行index.php發現沒有錯誤,修改index.php進行方法調用測試

index.php

<?phprequire_once("a.php");require_once("b.php");$a1 = new demo1\a\Test\Test();$a1->ceshi();

現在運行index.php檔案

D:\phpStudy\WWW\demo\demo1\a.php

3. 例三

現在有另外一種情況,比如我需要執行個體化a.php中的Test類多次,那麼每次我們都需要命名空間資訊完整寫的話比較麻煩怎麼辦呢?比如:

<?phprequire_once("a.php");require_once("b.php");$a1 = new demo1\a\Test\Test();$a2 = new demo1\a\Test\Test();$a1->ceshi();echo '<br/>';$a2->ceshi();

雖然也沒有錯誤,但是你會發現比較麻煩,每次都需要全寫命名空間名稱,雖然不報錯並且可以ctrl+c,ctrl+v,但是不太美觀(^_^)。

你可以這樣做

index.php

<?phprequire_once("a.php");require_once("b.php");use demo1\a\Test\Test;$a1 = new Test();$a2 = new Test();$a1->ceshi();echo '<br />';$a2->ceshi();

use關鍵字是用來引入類,用命名空間的方式表示使用了某個類。後面就可以直接執行個體化操作

4. 例五

接下來另一個問題又來了,如下:

index.php

<?phprequire_once("a.php");require_once("b.php");use demo1\a\Test\Test;use demo1\b\Test\Test;$a = new Test();$b = new Test();$a->ceshi();echo '<br />';$b->ceshi();

現在運行index.php檔案

Fatal error: Cannot use demo1\b\Test\Test as Test because the name is already in use in D:\phpStudy\WWW\demo\demo1\index.php on line 5

因為雖然使用了命名空間,但是兩個類名稱相同,都是Test,程式不知道第二個Test類是b.php中的Test類,這時候你就用到了as關鍵字

index.php

<?phprequire_once("a.php");require_once("b.php");use demo1\a\Test\Test;use demo1\b\Test\Test as bTest;$a = new Test();$b = new bTest();$a->ceshi();echo '<br />';$b->ceshi();

as關鍵字是對類名稱定義別名,可以有效防止類名稱相同衝突

5. 例六

比如我們在a.php同級再建立一個全域類檔案:c.php:

c.php

<?phpclass Test{    public function ceshi(){        echo __FILE__;    }}

在index.php檔案中這樣做即可調用c.php中的test方法

<?phprequire_once("a.php");require_once("b.php");require_once("c.php");use demo1\a\Test\Test;use demo1\b\Test\Test as bTest;$a = new Test();$a->ceshi();echo '<br />';$b = new bTest();$b->ceshi();echo '<br />';$c = new \Test();$c->ceshi();echo '<br />';

我們將這種類叫做全域類,如果要使用需要類前面加入反斜線”\”

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.