目錄
- 為什么使用命名空間
- 使用命名空間
為什么使用命名空間
目的,就是為了避免出現(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é):
- use 關(guān)鍵詞必須要寫在 PHP 文件的頭部,在標(biāo)簽 <?php 或 namespace 聲明之后;
- 使用 use 來倒入代碼時,不需要以 \ 字符作為開始,PHP 默認命名空間是 fully qualified;
- 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();
}
}