PHP 現(xiàn)代開發(fā)基礎(chǔ)知識: 命名空間 - namespace

目錄

  1. 為什么使用命名空間
  2. 使用命名空間

為什么使用命名空間

目的,就是為了避免出現(xiàn)命名沖突,導(dǎo)致 PHP 運行失敗。
同一個開發(fā)團隊中,這個命名沖突,可以通過項目管理規(guī)范來避免??墒牵S著 PHP 項目的不斷演變,一個項目代碼也會不斷增多,PHP 社區(qū)也積累了很多的優(yōu)秀代碼包?,F(xiàn)代 PHP 項目中,我們就可以直接使用這些現(xiàn)成的代碼包,減少開發(fā)工作量,縮短開發(fā)周期,更少的 bug,更快的系統(tǒng)性能。

正是,因為引入了第三方代碼包,而這些代碼包中:類(class), 接口(interface),函數(shù) (function) 和 常量 (constant) 都是無法控制的。那么,命名空間的就顯得不可或缺。

具體命名空間例子:

namespace Jamesxu\Component;

命名空間的聲明,總是出現(xiàn)單獨一行出現(xiàn)在 <?php 標(biāo)簽之后。上面代碼的意思是,類是定義/生存在 Component 子命名空間下。

一個命名空間包含與組織了相關(guān)的 PHP 類,如同一個文件系統(tǒng)包含相關(guān)的文件。

聲明
每個 PHP 類,接口,函數(shù)/方法,與參數(shù)都是存在于一個命名空間(或子命名空間)。
命名空間,以單獨一行出現(xiàn)在 PHP 開標(biāo)簽 <?php 之后。

格式是:namespace 空格字符 命名空間名字; (; 代表結(jié)束)

namespace 通常用來聲明一個 top-level vendor name,如:

<?php
namespace Jamexu;
所有 PHP class,interface, functions, or constant 聲明都在該命名空間下??梢允褂米用臻g來組織代碼。

子命名空間的聲明也和前面相同,唯一不同的是命名空間與子命名空間使用 \ 字符分隔。

在命名空間下,聲明名為 ModernPHP子命名空間:

<?php
namespace Jamesxu\ModernPHP;

引用和別名

使用別名,可以不需要輸入整個命名空間。

Example 2-1. Namespace without alias

沒有別名的命名空間
<?php
$response = new \Symfony\Component\HttpFoundation\Response('Oops', 400);
$response->send();

Example 2-2. Namespace with default alias

具有默認別名的命名空間
<?php
use Symfony\Component\HttpFoundation\Response;

$response = new Response('Oops', 400);
$response->send();

tell PHP we intend to use the Symfony\Component\HttpFoundation\Response class with the use keyword.

Example 2-3. Namespace with custom alias

自定義別名( as Res)
<?php
use Symfony\Component\HttpFoundation\Response as Res;
$r = new Res('Oops', 400);
$r->send();

use Symfony\Component\HttpFoundation\Response as Res; 導(dǎo)入 Response 類,并使用 Res 作為 Response 類的別名。如果不追加 as Res,PHP 默認將使用導(dǎo)入的類名作為別名

總結(jié):

  1. use 關(guān)鍵詞必須要寫在 PHP 文件的頭部,在標(biāo)簽 <?php 或 namespace 聲明之后;
  2. 使用 use 來倒入代碼時,不需要以 \ 字符作為開始,PHP 默認命名空間是 fully qualified;
  3. use 必須要存在于全局作用域中,而不是在一個類或方法中,因為需要在編譯時使用到??梢栽诿臻g的聲明下,使用 use 導(dǎo)入代碼。

引入函數(shù)與常量

use func

<?php
use funs Namesoace\functionName;
functionName();

use constant

<?php
use constant Namesoace\CONST_NAME;
echo CONST_NAME;

多行導(dǎo)入

<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;

全局命名空間 (Global Namespace)

使用一個沒有命令空間的類,接口,方法,或常數(shù)時,PHP 默認把類,接口,方法,或常數(shù)當(dāng)作存在于當(dāng)前命名空間來處理。

在另一個命名空間中,引用一個命名空間的類,接口,方法,或常量,必須要使用 fully qualified PHP class name (namespace + class name)。既可以輸入 fully qualified PHP class name,或用 use 導(dǎo)入。

在另一個命名空間中,使用全局變量代碼,只需要在 class,interface,function,or constant 前添加 \ 字符。

Example 2-4. Unqualified class name inside another namespace

<?php
namespace My\App;

class Foo
{
public function doSomething()
{
/*
Fails, because PHP searches for a \My\App\Exception >class that does not exist.
*/
$exception = new Exception();
}
}

添加 \ 做前綴,PHP 將 Exception 類作為全局命名空間來處理

<?php
namespace My\App;

class Foo
{

public function doSomething()
{
// add a \ prefix the Exception class name
// It tells PHP to look for the Exception class in the global >namespace instead of the current
// namespace.
throw new \Exception();
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • 對于命名空間,官方文檔已經(jīng)說得很詳細[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    斯文小螞蟻閱讀 660評論 0 0
  • 對于命名空間,官方文檔已經(jīng)說得很詳細[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    斯文小螞蟻閱讀 447評論 0 0
  • 收藏自cnblog,寫的非常清晰,感謝作者‘流金歲月’http://www.cnblogs.com/kuyuecs...
    InitialX閱讀 1,236評論 0 5
  • 對于命名空間,官方文檔已經(jīng)說得很詳細[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    司馬東陽閱讀 251評論 0 0

友情鏈接更多精彩內(nèi)容