PHP命名空間學習筆記

2021-09-27 13:43:00 字數 3539 閱讀 5239

命名空間的支援版本:php 5 > 5.3.0,php 7 。

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

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

php 命名空間提供了一種將相關的類、函式和常量組合到一起的途徑。

命名空間通過關鍵字namespace 來宣告。宣告命名空間的語句必須是檔案的第一行語句,除了乙個以外:declare關鍵字。在宣告命名空間之前唯一合法的**是用於定義原始檔編碼方式的 declare 語句。另外,所有非 php **包括空白符都不能出現在命名空間的宣告之前。同乙個命名空間可以定義在多個檔案中,即允許將同乙個命名空間的內容分割存放在不同的檔案中。

<?php

namespace myproject;

const connect_ok = 1;

class connection

function connect()

?>

同目錄具有層次結構類似,命名空間也支援指定層次化的命名空間名稱。

<?php

namespace myproject\sub\level;

const connect_ok = 1;

class connection

function connect()

?>

上面的例子建立了常量myproject\sub\level\connect_ok,類 myproject\sub\level\connection和函式 myproject\sub\level\connect。

php還支援在同乙個檔案中定義不同的命名空間,但是非常不建議這種用法,這裡就不多說了。

這裡我有乙個疑問,上面說命名空間定義必須是檔案的第一行**,那在乙個檔案中定義多個命名空間不就是會出現不在第一行的情況?

針對這個問題試驗了一下,對於乙個檔案中包含多個命名空間的,必須所有的**都在某乙個命名空間中,否則就會報fatal error: no code may exist outside of namespace {} in的錯誤,對於全域性**,那就放在全域性的命名空間中,類似這樣namespace

php 命名空間中的元素可以通過三種方式引用,以類名為例:

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

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

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

namespace常量

常量__namespace__的值是包含當前命名空間名稱的字串。在全域性的,不包括在任何命名空間中的**,它包含乙個空的字串。

namespace 關鍵字

關鍵字 namespace 可用來顯式訪問當前命名空間或子命名空間中的元素。它等價於類中的 self 操作符。

所有支援命名空間的php版本支援三種別名或匯入方式:為類名稱使用別名、為介面使用別名或為命名空間名稱使用別名。php 5.6開始允許匯入函式或常量或者為它們設定別名。在php中,別名是通過操作符 use 來實現的.

<?php

namespace foo;

use my\full\classname as another;

// 下面的例子與 use my\full\nsname as nsname 相同

use my\full\nsname;

// 匯入乙個全域性類

use arrayobject;

// importing a function (php 5.6+)

use function my\full\functionname;

// aliasing a function (php 5.6+)

use function my\full\functionname as func;

// importing a constant (php 5.6+)

use const my\full\constant;

$obj = new namespace\another; // 例項化 foo\another 物件

$obj = new another; // 例項化 my\full\classname 物件

nsname\subns\func(); // 呼叫函式 my\full\nsname\subns\func

$a = new arrayobject(array(1)); // 例項化 arrayobject 物件

// 如果不使用 "use \arrayobject" ,則例項化乙個 foo\arrayobject 物件

func(); // calls function my\full\functionname

echo constant; // echoes the value of my\full\constant

?>

注意對命名空間中的名稱(包含命名空間分隔符的完全限定名稱如 foo\bar以及相對的不包含命名空間分隔符的全域性名稱如 foobar)來說,前導的反斜槓是不必要的也不推薦的,因為匯入的名稱必須是完全限定的,不會根據當前的命名空間作相對解析。為了簡化操作,php還支援在一行中使用多個use語句。

如果沒有定義任何命名空間,所有的類與函式的定義都是在全域性空間,與 php 引入命名空間概念前一樣。在名稱前加上字首  表示該名稱是全域性空間中的名稱,即使該名稱位於其它的命名空間中時也是如此。

PHP學習筆記4 命名空間

定義多個命名空間 使用命名空間 namespace關鍵字和魔術常量 namespace 命名空間的別名 匯入 命名空間在專案中的使用 宣告乙個命名空間的語法格式 namespace spacename 這裡的 都是空間中的 語法說明 1 namespace 是宣告空間的關鍵字,不區分大小寫 2 sp...

PHP命名空間筆記

此篇文章作為我從開始學習php到工作一段時間後的命名空間知識點總結,會隨學習和工作的提高而完善 命名空間 定義命名空間意義 一 為了解決多檔案中 相互引入時 類名,常量名,函式名可能會重複命名的問題 二 快速定位檔案位置 三 就是給檔案加個隱式字首 四 命名空間需要寫在檔案的最前面 全域性空間 如果...

命名空間 PHP筆記

命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念,比如在作業系統中,目錄用來將相關檔案分組,對於目錄中的檔案來說,目錄就扮演了命名空間的角色。這個原理應用到程式設計領域就是命名空間的概念。php 5.3後的版本開始支援命名空間。命名空間通過關鍵字namespace來宣告。任何合法的ph...