當前位置:才華齋>計算機>php語言>

PHP中的名稱空間介紹

php語言 閱讀(8.72K)

導語:PHP名稱空間(namespace)的概念、正在使用名稱空間、定義名稱空間、子名稱空間、從名稱空間中呼叫程式碼等內容你都知道嗎?以下的是本站小編為大家蒐集的PHP中的名稱空間詳細介紹,希望對你有所幫助。

PHP中的名稱空間介紹

  概述

PHP對於名稱空間的支援,經歷了一段艱難的旅程。幸運的是,PHP從5.3開始引入了名稱空間。自從PHP引入了名稱空間,PHP程式碼的適用結構也得到了大大的改善。許多程式語言早就有了名稱空間的概念,相對於其他語言來說,PHP對於名稱空間的支援,稍微有點晚了。不管如何,每一種新特性的引入都有其目的,和其他語言一樣,PHP引入名稱空間也主要是為了解決名字衝突的問題。

名稱空間(namespace)的概念

  程式碼如下:

當在字串中使用名稱空間名字的時候,一定不要忘了轉義

可以將名稱空間想象成一個抽屜,你可以在抽屜裡放入鉛筆、尺子、A4紙等,這些都是你自己的私有物品。在你的抽屜下面是別人的抽屜,別人也可以在抽屜裡放入相同的物品。為了不拿錯物品,你們決定在自己的抽屜上貼上標籤,這樣就可以清晰的看到某個物品是屬於誰的了。

之前,開發者必須在類、函式和常量中新增下劃線,用來使自己的程式碼獨立其他於程式碼庫。這相當於所有人都給自己的物品貼上標籤之後,一起放入了一個更大的抽屜裡。儘管這也是一種組織程式碼的方式,但是這種方式是非常低效的。

名稱空間的到來就是為了解決這個問題。我們可以在不同的名稱空間裡宣告相同的函式、類和常量,而不會造成名字上的衝突。本質上,名稱空間無非是一種分等級標記PHP程式碼的方式。

  正在使用名稱空間

有一點需要注意的是,我們正在間接的使用名稱空間。從PHP 5.3開始,所有在非使用者定義的名稱空間中的宣告(類、函式、常量),都預設的屬於全域性名稱空間。

全域性名稱空間中包含了所有PHP內部的定義,如echo()、mysqli_connect()和Exception類。由於全域性名稱空間並沒有獨立的標識名,所以它經常被成為全域性空間(global space)。

  定義名稱空間

名稱空間的定義必須是PHP檔案的第一條語句。唯一允許在定義名稱空間之前使用的語句是declare語句。

定義名稱空間很簡單,只需要使用關鍵字namespace即可。名稱空間的名字需要遵循PHP檔案中其他識別符號的命名規則。

  下面是定義一個名稱空間的示例:

  程式碼如下:

namespace MyNamespace{

class Test{

}

}

如果想定義一個屬於全域性空間的程式碼塊,也是使用namespace關鍵字,但是後面不加名稱空間的名字,如下:

程式碼如下:

namespace {

class Test{

}

}

  我們甚至可以在一個檔案中定義多個名稱空間,如下:

  程式碼如下:

namespace MyNamespace {

}

namespace MySecondNamespace {

}

namespace {

}

我們也可以將一個名稱空間分散在不同的檔案中,檔案包含的處理程式會自動合併他們。因此,限制大量的名稱空間在同一個檔案中定義是一個很好的程式設計實踐,就像我們通常單獨為每個類定義一個單獨的檔案一樣。

  複製程式碼 程式碼如下:

有一點需要注意的是,包含名稱空間程式碼塊的{是可選的,可以用也可以不用。事實上,只要我們堅持在一個檔案中只定義一個名稱空間,那麼我們就可以完全省略{,這樣也可以使我們的程式碼看起來更加簡潔。

  子名稱空間

名稱空間可以遵循一個特定的層級,就像我們電腦檔案系統中得目錄一樣。子名稱空間對於將一個專案結構化尤其特別有用。例如,你的專案需要訪問資料庫,你可能會想將所有資料庫相關的程式碼(如資料庫異常處理等)放在同一個子目錄下。

為了保持靈活性,將子名稱空間放在子目錄中是非常明智的做法。這會使你的程式碼結構更清晰,而且會使遵循PSR-0標準的autoloaders的使用變得更容易。

PHP使用反斜線作為名稱空間的分隔符,有趣的是,PHP甚至考慮過使用笑臉:)作為名稱空間的分隔符。

  子名稱空間定義示例:

  程式碼如下:

namespace MyProjectDatabase

class Connection {

}

可以使用盡可能多的子名稱空間:

  程式碼如下:

namespace MyProjectBlogAuthHandlerSocial;

class Twitter {

}

有一點需要注意的是,PHP並不支援名稱空間的巢狀定義,下面的程式碼會導致一個致命錯誤:Namespace declarations cannot be nested。

  程式碼如下:

namespace MyProject {

namespace Database {

class Connection { }

}

}

  從名稱空間中呼叫程式碼

如果你想在不同的名稱空間中例項化一個類、呼叫一個函式或者使用常量,需要使用反斜線。他們可以從三個角度被解析

1.未限定的名字

2.限定的名字

3.完全限定的名字

未限定的名字(Unqualified Name)

這是一個類的名稱,函式或常量,但是不包括任何命名的引用。如果名稱空間對你來說還比較陌生,那麼這就是你熟悉的角度。

程式碼如下:

namespace MyProject;

class MyClass {

static function static_method()

{

echo 'Hello, world!';

}

}

// Unqualified name, resolves to the namespace you are currently in (MyProjectMyClass)

MyClass:static_method();

限定的名字(Qualified Name)

這是我們如何使用子名稱空間的方式。示例如下:

  程式碼如下:

namespace MyProject;

require 'myproject/database/';

// Qualified name, instantiating a class from a sub-namespace of MyProject

$connection = new DatabaseConnection();

完全限定的名字(Fully Qualified Name)

前面所說的.使用限定的名字和未限定的名字,都是相對於當前所處的名稱空間來說的。以上兩種方式僅可以被用來訪問當前所處的名稱空間和更深層次的子名稱空間。

如果想訪問一個在比前名稱空間更高的層級,那麼就需要使用完全限定的名字—一個絕對路徑而不是相對路徑。這可以歸結為在名稱空間的最前面加反斜槓。使用完全限定的名字可以讓PHP知道,這次呼叫是從全域性空間開始的,而不是相對於當前所處的名稱空間。示例如下:

  程式碼如下:

namespace MyProjectDatabase;

require 'myproject/fileaccess/';

// Trying to access the MyProjectFileAccessInput class

// This time it will work because we use the fully qualified name, note the leading backslash

$input = new MyProjectFileAccessInput();

對於PHP的內部函式來說,我們不必要使用完全限定的名字。在當前所處的名稱空間中,呼叫一個不存在的未限定的名字的類或函式,PHP會搜尋全域性空間。

記住了這個規則,我們就可以像下面那樣重寫PHP的內部函式: