關(guān)于PHP中的命名空間
By:0x584A Date:2015年10月28日 23:08:57
0x01 前言
最近都在啃ThinkPHP以及Yii2兩個開源框架嫂拴,其中比較重要的一個核心便是命名空間筒狠。
起初寫代碼時沒關(guān)注這個箱沦,但印象里老師有教過(其實是自己忘掉了)
饱普。所以今天便來惡補了下套耕,其實理解起來挺簡單并不難。
以前大學(xué)時搗鼓ASP.NET匈挖,也出去在網(wǎng)絡(luò)公司工作了一年,小公司嘛大部分還是用工廠模式開發(fā)舶吗。隨后便換了工作荒廢了一年誓琼,現(xiàn)在才轉(zhuǎn)入PHP的語言腹侣。說來真的慚愧齿穗,當在PHP中見到命名空間時
想起C#中就有窃页,但因為很少用所以模模糊糊的脖卖。
0x02 為什么PHP中使用命名空間?
當兩個php文件中定義了同名的類時作儿,便會引起命名沖突的錯誤攻锰。列:
A.php
<?php
class setClass
{
function getClass(){
echo "my Class -> A";
}
}
?>
B.php
<?php
class setClass
{
function getClass(){
echo "my Class -> A";
}
}
?>
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
?>
顯示錯誤提示:
Fatal error: Cannot redeclare class setClass in H:\yii2\B.php on line 4
致命的錯誤:不能重新聲明類setClass
0x03 如何使用命名空間
定義:
A.php
<?php
namespace aaa; # 定義名稱aaa
class setClass
{
function getClass(){
echo "my Class -> A";
}
}
?>
B.php
<?php
namespace bbb; # 定義名稱bbb
class setClass
{
function getClass(){
echo "my Class -> A";
}
}
?>
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
?>
這樣定義后娶吞,運行Test.php便不會出現(xiàn)類名沖突的問題了。
也可以將namespace bbb;改寫成use bbb; 在實現(xiàn)效果上械姻,兩者都是一致的妒蛇。
我們在使用時只需如下使用即可:
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
$A = new aaa\setClass; # 實例化命名空間aaa下的setClass類
$A->getClass();
?>
我們還可以改寫成如下形式:
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
use aaa\setClass; # 引入名稱空間aaa下的steClass類
$A = new setClass; # 實例化setClass類
$A->getClass();
?>
0x04 命名空間的別名使用
當然出現(xiàn)如下代碼時,會出現(xiàn)致命錯誤楷拳,說不能使用bbb\setClass用作實例化steClass绣夺,因為該名稱已被使用。這時候就需要用到別名了欢揖。
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
use aaa\setClass; # 引入名稱空間aaa下的steClass類
use bbb\setClass; # 引入名稱空間bbb下的steClass類
$A = new setClass; # 實例化setClass類
$A->getClass();
?>
改寫成如下格式:
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
use aaa\setClass;
use bbb\setClass as bbb;
$A = new bbb(); # 實例化別名bbb的setClass類
$A->getClass();
?>
0x05 全局命名空間
比如說陶耍,現(xiàn)在又有一個C.php,被引入到Test.php文件中她混。
C.php
<?php
class setClass
{
function getClass(){
echo "my Class -> C";
}
}
?>
Test.php
<?php
require_once 'A.php';
require_once 'B.php';
require_once 'C.php'; # 引入C.php文件
?>
此時我們想要使用C.php的setClass類中g(shù)etClass方法烈钞,則需在實例化時在前面加一個反斜杠‘\’
<?php
require_once 'A.php';
require_once 'B.php';
require_once 'C.php'; # 引入C.php文件
$C = new \setClass; # 加上'\' 則說明實例化頂級空間中的setClass類
$C->getClass();
?>