如何理解PHP核心特性命名空間
提出
PHP 在 5.3 后提出了命名空間用來解決組件之間的命名沖突問題,主要參考了文件系統(tǒng)的設計:
- 同一個目錄下不允許有相同的文件名 - 同一個命名空間下不允許有相同的類;
- 不同的目錄可以有同名文件 - 不同的命名空間可以有相同的類;
定義
使用namespace關鍵字來定義一個命名空間。其中,頂層命名空間通常為廠商名,不同開發(fā)者的廠商命名空間是唯一的。命名空間不需要與文件目錄一一對應,但是最好遵守PSR-4規(guī)范。
<?php namespace Symfony\Component\HttpFoundation; class Request { } 命名空間必須在所有代碼之前聲明,唯一的例外就是 declare 關鍵字。 <?php declare(strict_types=1); namespace App;
命名空間內(nèi)可包含任意 PHP 代碼,但是僅對類 (包括抽象類和 Trait)、接口、函數(shù)和常量這四種類型生效。
<?php namespace MyProject; const CONNECT_OK = 1; class FOO {} interface Foo{} function foo() {}
使用
使用use關鍵字來引入命名空間
<?php namespace App; use Symfony\Component\HttpFoundation\Request; use Foo\Bar; class Test { public function run() { $bar = new Bar(); } }
定義和使用推薦遵循PSR-2的規(guī)范
- namespace之后必須存在一個空行;
- 所有use聲明必須位于namespace聲明之后;
- 每條use聲明必須只有一個use關鍵字。
use語句塊之后必須存在一個空行。
當use引入的類出現(xiàn)同名時,可使用as來定義別名
<?php namespace App; use Foo\Bar as BaseBar; class Bar extends BaseBar { }
限定符
除了使用use外,還可以直接使用\限定符來進行解析,規(guī)則很簡單:如果含有\(zhòng)前綴則代表從全局命名空間開始解析,否則則代表從當前命名空間開始解析。
<?php namespace App; \Foo\Bar\foo(); // 解析成 \Foo\Bar\foo(); Foo\Bar\foo(); // 解析成 App\Foo\Bar\foo(); 此規(guī)則也適用于函數(shù)、常量等 $a = \strlen('hi'); // 調(diào)用全局函數(shù) strlen $b = \INI_ALL; // 訪問全局常量 INI_ALL $c = new \Exception('error'); // 實例化全局類 Exception
有兩個需要特別注意的地方:
對于函數(shù)和常量而言,如果當前命名空間不存在,則會自動去全局命名空間去尋找,因此可省略\前綴。對于類而言,如果當前命名空間解析不到,不會去全局空間尋找,因此,不可省略\
$a = strlen('hi'); $b = INI_ALL; $c = new Exception('error'); // 錯誤 $c = new \Exception('error'); // 正確
當動態(tài)調(diào)用命名空間時,該命名空間始終會被當成是全局命名空間,因此可以省略前綴\
$class1 = 'Foo\Bar'; $object1 = new $class1; // 始終被解析成 \Foo\Bar
在內(nèi)部訪問命名空間
PHP 支持兩種抽象的訪問當前命名空間內(nèi)部元素的方法,__NAMESPACE__魔術常量和namespace關鍵字。
__NAMESPACE__常量的值是包含當前命名空間名稱的字符串,如果是在全局命名空間,則返回空字符串。
<?php namespace MyProject; function get($classname) { $a = __NAMESPACE__ . '\\' . $classname; return new $a; }
關鍵字namespace可用來顯式訪問當前命名空間或子命名空間中的元素。它等價于類中的self操作符
namespace App; use blah\blah as mine; blah\mine(); // App\blah\mine() namespace\blah\mine(); // App\blah\mine() namespace\func(); // App\func() namespace\sub\func(); // App\sub\func() namespace\cname::method(); // App\cname::method() $a = new namespace\sub\cname(); // App\sub\cname $b = namespace\CONSTANT; // App\CONSTANT
轉(zhuǎn)義\符號
此外,推薦對所有的\進行轉(zhuǎn)義,避免出現(xiàn)不可預期的后果
$class = "dangerous\name"; // \n 被解析成換行符 $obj = new $class; $class = 'dangerous\name'; // 正確,但是不推薦 $class = 'dangerous\\name'; // 推薦 $class = "dangerous\\name"; // 推薦
以上就是如何理解PHP核心特性命名空間的詳細內(nèi)容,更多關于PHP命名空間的資料請關注腳本之家其它相關文章!
相關文章
PHP使用PhpSpreadsheet操作Excel實例詳解
這篇文章主要介紹了PHP使用PhpSpreadsheet操作Excel,結合實例形式詳細分析了PHP使用PhpSpreadsheet操作Excel的相關組件下載、函數(shù)功能與操作技巧,需要的朋友可以參考下2020-03-03