PHP 核心特性之命名空間

2021-09-29 05:18:04 字數 2725 閱讀 2250

提出

在命名空間提出之前,不同的元件很容易碰到命名的衝突,例如 request 、response 等常見的命名。php 在 5.3 後提出了命名空間用來解決元件之間的命名衝突問題,主要參考了檔案系統的設計:

同乙個目錄下不允許有相同的檔名 - 同乙個命名空間下不允許有相同的類;

不同的目錄可以有同名檔案 - 不同的命名空間可以有相同的類;

定義

使用 namespace 關鍵字來定義乙個命名空間。其中,頂層命名空間通常為廠商名,不同開發者的廠商命名空間是唯一的。命名空間不需要與檔案目錄一一對應,但是最好遵守 psr-4 規範。

class request命名空間必須在所有**之前宣告,唯一的例外就是 declare 關鍵字。

<?php

declare(strict_types=1);

命名空間內可包含任意 php **,但是僅對類 (包括抽象類和 trait)、介面、函式和常量這四種型別生效。

<?php

namespace myproject;

const connect_ok = 1;

class foo {}

inte***ce foo{}

function foo() {}

使用

使用 use 關鍵字來引入命名空間

}定義和使用推薦遵循 psr-2 的規範

namespace 之後必須存在乙個空行;

所有 use 宣告必須位於 namespace 宣告之後;

每條 use 宣告必須只有乙個 use 關鍵字。

use 語句塊之後必須存在乙個空行。

當 use 引入的類出現同名時,可使用 as 來定義別名

<?php

use foo\bar as basebar;

class bar extends basebar

限定符

除了使用 use 外,還可以直接使用 \ 限定符來進行解析,規則很簡單:如果含有 \ 字首則代表從全域性命名空間開始解析,否則則代表從當前命名空間開始解析。

<?php

\foo\bar\foo(); // 解析成 \foo\bar\foo();

此規則也適用於函式、常量等

$a = \strlen('hi'); // 呼叫全域性函式 strlen

$b = \ini_all; // 訪問全域性常量 ini_all

$c = new \exception('error'); // 例項化全域性類 exception

有兩個需要特別注意的地方:

對於函式和常量而言,如果當前命名空間不存在,則會自動去全域性命名空間去尋找,因此可省略 \ 字首。對於類而言,如果當前命名空間解析不到,不會去全域性空間尋找,因此,不可省略 \

$a = strlen('hi');

$b = ini_all;

$c = new exception('error'); // 錯誤

$c = new \exception('error'); // 正確

當動態呼叫命名空間時,該命名空間始終會被當成是全域性命名空間,因此可以省略字首 \

$class1 = 'foo\bar';

$object1 = new $class1; // 始終被解析成 \foo\bar

在內部訪問命名空間

php 支援兩種抽象的訪問當前命名空間內部元素的方法,namespace魔術常量和 namespace 關鍵字。

namespace常量的值是包含當前命名空間名稱的字串,如果是在全域性命名空間,則返回空字串。

<?php

namespace myproject;

function get($classname)

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

use blah\blah as mine;

轉義 \ 符號

此外,推薦對所有的 \ 進行轉義,避免出現不可預期的後果

$class = "dangerous\name"; // \n 被解析成換行符

$obj = new $class;

$class = 'dangerous\name'; // 正確,但是不推薦

$class = 'dangerous\\name'; // 推薦

$class = "dangerous\\name"; // 推薦

PHP核心 命名空間

在維基百科中,對命名空間的定義是 命名空間 英語 namespace 表示識別符號 identifier 的上下文 context 乙個識別符號可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。在程式語言中,命名空間是一種特殊的作用域,它包含了處於該作用域內的識別符號,且本身也用乙個識別...

PHP5 3新特性之命名空間

命名空間 namespaces php5.3最大的新功能 完全支援名字空間特徵 大部分的功能的執行在編譯時 簡化命名慣例 1 更清晰的 不使用 namespaces 2 使用 namespaces 3 乙個檔案中多個名字空間 namespace lib class mysql class sqlit...

php 命名空間,PHP使用命名空間

介紹 命名空間中的類,函式或常量可以通過以下方式使用 在當前命名空間中使用類 指定相對於當前命名空間的命名空間 提供命名空間的全限定名稱 從當前命名空間 在此示例中,從test1.php載入了命名空間。沒有命名空間引用的函式或類名稱將訪問當前命名空間中的功能或類名稱 示例 test1.php nam...