PHP的命名空間是什么

PHP命名空間的是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創新互聯建站從2013年創立,是專業互聯網技術服務公司,擁有項目網站制作、網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元商丘做網站,已為上家服務,為商丘各地企業和個人服務,聯系電話:18982081108

namespace即“命名空間”,也稱“名稱空間” 。VS.NET中的各種語言使用的一種代碼組織的形式 通過名稱空間來分類,區別不同的代碼功能 同時也是VS.NET中所有類的完全名稱的一部分。命名空間是用來組織和重用代碼的。如同名字一樣的意思,NameSpace(名字空間),之所以出來這樣一個東西,是因為人類可用的單詞數太少,并且不同的人寫的程序不可能所有的變量都沒有重名現象,對于庫來說,這個問題尤其嚴重,如果兩個人寫的庫文件中出現同名的變量或函數(不可避免),使用起來就有問題了。為了解決這個問題,引入了名字空間這個概念,通過使用 namespace xxx;你所使用的庫函數或變量就是在該名字空間中定義的,這樣一來就不會引起不必要的沖突了。

提出

在命名空間提出之前,不同的組件很容易碰到命名的沖突,例如 Request 、Response 等常見的命名。PHP 在 5.3 后提出了命名空間用來解決組件之間的命名沖突問題,主要參考了文件系統的設計:

同一個目錄下不允許有相同的文件名 - 同一個命名空間下不允許有相同的類;

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

定義

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

<?php
namespace Symfony\Component\HttpFoundation;
class Request {
}

命名空間必須在所有代碼之前聲明,唯一的例外就是 declare 關鍵字。

<?php
declare(strict_types=1);
namespace App;

命名空間內可包含任意 PHP 代碼,但是僅對類 (包括抽象類和 Trait)、接口、函數和常量這四種類型生效。

<?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 的規范

namespace 之后必須存在一個空行;

所有 use 聲明必須位于 namespace 聲明之后;

每條 use 聲明必須只有一個 use 關鍵字。

use 語句塊之后必須存在一個空行。

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

<?php
namespace App;
use Foo\Bar as BaseBar;
class Bar extends BaseBar {
}

限定符

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

<?php
namespace App;
\Foo\Bar\foo();  // 解析成 \Foo\Bar\foo();
Foo\Bar\foo();  // 解析成 App\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)
{
    $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

轉義 \ 符號

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

$class = "dangerous\name"; // \n 被解析成換行符
$obj = new $class;
$class = 'dangerous\name'; // 正確,但是不推薦
$class = 'dangerous\\name'; // 推薦
$class = "dangerous\\name"; // 推薦

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。

網頁名稱:PHP的命名空間是什么
網頁路徑:http://m.kartarina.com/article26/gessjg.html

成都網站建設公司_創新互聯,為您提供微信公眾號、品牌網站設計、移動網站建設、網站導航、網頁設計公司企業網站制作

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
主站蜘蛛池模板: 久久久久久精品无码人妻| 国产精品多人p群无码| 国产精品亚洲а∨无码播放麻豆 | 无码精品人妻一区二区三区影院 | 精品无码久久久久久久久| 国产精品亚洲а∨无码播放不卡| 亚洲AV无码国产剧情| 久久久久亚洲Av片无码v| 午夜爽喷水无码成人18禁三级| 国产成人无码网站| 亚洲国产成人无码AV在线影院| 无码精品蜜桃一区二区三区WW| 无码人妻品一区二区三区精99| 日韩精品无码人妻一区二区三区| 亚洲AV无码乱码国产麻豆穿越| 国产成人无码午夜视频在线观看| 在线看无码的免费网站| 亚洲VA中文字幕无码一二三区| 精品人妻无码专区在中文字幕| 一本天堂ⅴ无码亚洲道久久 | 亚洲AV无码专区国产乱码电影| 国产莉萝无码AV在线播放| 亚洲综合久久精品无码色欲| 亚洲日韩乱码中文无码蜜桃臀| 亚洲av无码不卡一区二区三区| 国产av永久无码天堂影院| 亚洲中文字幕无码日韩| 人妻少妇偷人精品无码| 亚洲最大天堂无码精品区| 久久久久无码精品国产h动漫 | 亚洲一区二区三区国产精品无码 | 激情无码人妻又粗又大中国人 | 久久无码无码久久综合综合| 无码人妻精品一区二区三区久久久| 人妻av无码一区二区三区| 国外AV无码精品国产精品| 国产成年无码久久久免费| 国产精品无码免费播放 | 久久无码av三级| 东京热av人妻无码| 久久精品九九热无码免贵|