對於PHP中名稱空間概念的入門理解

TP_funny發表於2015-01-10
1. PHP中的名稱空間是什麼?
什麼是名稱空間?這又是一篇PHP學習內容的介紹,“從廣義上來說,名稱空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在作業系統中目錄用來將相關檔案分組,對於目錄中的檔案來說,它就扮演了名稱空間的角色。具體舉個例子,檔案 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 檔案。另外,在目錄 /home/greg 外訪問 foo.txt 檔案時,我們必須將目錄名以及目錄分隔符放在檔名之前得到 /home/greg/foo.txt。這個原理應用到程式設計領域就是名稱空間的概念。”——名稱空間概述
 
2. PHP名稱空間該如何理解?
從本質上講,名稱空間就是一個容器,這個容器內我們可以放入類、函式和變數,他們在同一名稱空間內可以無條件相互訪問。在名稱空間之外,就必須引用或者匯入其他名稱空間,才能呼叫它們包含的這些項。
名稱空間跟shell中的檔案目錄的概念是一樣一樣的。在當前目錄下可以直接用檔名訪問所有檔案,如果需要訪問其他目錄下的檔案,就需要輸入相對路徑或絕對路徑。

引用方式:
namespace foo;

class Foo {
    public function foo()
    {
        return \top\namespace\bar\Bar::fuck();
    }
}

匯入方式:
namespace foo;

use top\namespace\bar\Bar;

class Foo {
    public function foo()
    {
        return Bar::fuck();
    }
}
匯入就相當於將目的類複製一份到當前名稱空間中。


 

3. PHP名稱空間有何實際應用?
名稱空間的存在是為了解決下面兩個問題:
1. 使用者編寫的程式碼與PHP內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。
2. 為很長的識別符號名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。
目前非常流行的 Composer 就是一個基於名稱空間的包管理器/依賴管理器,同樣,Laravel 能達到今天的成功,很大程度上也是因為PHP5.3的普及,生恰逢時。你可以在 https://packagist.org/ 上下載到各種 composer 包,類似於 yum、npm或者gem。
 
4. 一些tips
1. 同一個空間下的類直接相互直接呼叫,屬於一家。例如 Laravel 中的 PageController 類中可以直接寫 Page::all() 這樣的程式碼來呼叫 Page 這個model,因為他們倆都在頂級名稱空間下。
2. 若一個類存在於非頂級名稱空間中,那麼它只能在呼叫同樣是當前名稱空間下的其他類才不用“引用”或“匯入”,它們屬於一家。任何子名稱空間都是另一個名稱空間,另一個容器,沒有除了容器之間關係之外的任何特殊關係。
3. Laravel 採用 classmap 方式進行自動載入(autoload),PHP雖然有了名稱空間這個高階特性,但是這只是邏輯關係,require 檔案還是要有的。這個類和檔案的對應關係就存在 /vendor/composer/autoload_classmap.php ,每次 composer dump-autoload 都會重新編譯、生成。

原文:PHP 名稱空間 入門
來自:PHP100
評論(2)

相關文章