關(guān)于PHP中的命名空間學(xué)習(xí)及使用

關(guān)于PHP中的命名空間

By:0x584A Date:2015年10月28日 23:08:57

0x01 前言

最近都在啃ThinkPHP以及Yii2兩個開源框架,其中比較重要的一個核心便是命名空間。
起初寫代碼時沒關(guān)注這個,但印象里老師有教過(其實是自己忘掉了)。所以今天便來惡補(bǔ)了下,其實理解起來挺簡單并不難。

以前大學(xué)時搗鼓ASP.NET,也出去在網(wǎng)絡(luò)公司工作了一年,小公司嘛大部分還是用工廠模式開發(fā)。隨后便換了工作荒廢了一年,現(xiàn)在才轉(zhuǎn)入PHP的語言。說來真的慚愧,當(dāng)在PHP中見到命名空間時
想起C#中就有,但因為很少用所以模模糊糊的。

0x02 為什么PHP中使用命名空間?

當(dāng)兩個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';
?>

這樣定義后,運(yùn)行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 命名空間的別名使用

當(dāng)然出現(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();
?>
最后編輯于
?著作權(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)容

  • 收藏自cnblog,寫的非常清晰,感謝作者‘流金歲月’http://www.cnblogs.com/kuyuecs...
    InitialX閱讀 1,237評論 0 5
  • 對于命名空間,官方文檔已經(jīng)說得很詳細(xì)[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    司馬東陽閱讀 251評論 0 0
  • 對于命名空間,官方文檔已經(jīng)說得很詳細(xì)[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    斯文小螞蟻閱讀 671評論 0 0
  • PHP 學(xué)習(xí)目錄 ├─PHP視頻教程 1 LAMP網(wǎng)站構(gòu)建 │ ├─PHP教程 1.1.1 新版視頻形式介紹│ ...
    曹淵說創(chuàng)業(yè)閱讀 16,287評論 29 417
  • 對于命名空間,官方文檔已經(jīng)說得很詳細(xì)[查看],我在這里做了一下實踐和總結(jié)。 命名空間一個最明確的目的就是解決重名問...
    斯文小螞蟻閱讀 449評論 0 0

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