PHP命令空間namespace及use的用法


使用namespace的目的

命名空間將代碼划分出不同的空間(區域),每個空間的常量、函數、類(為了偷懶,我下邊都將它們稱為元素)的名字互不影響, 這個有點類似我們常常提到的'封裝'的概念。

團隊合作項目時,避免與團隊其它成員新建的類發生沖突;個人負責項目時,避免前后新建的類發生沖突;

據個人理解,用到所需要的類時,需要先require或include引入,所以會發生類重定義的錯誤的前提是:兩個相同命名的類都有被引入。目前有些php框架會自動加載(即include)所有新建的model類,所以為了避免你新建的model類和項目框架原生的核心類發生重名沖突,采用了namespace。(想了想,與團隊成員新建的類產生沖突應該通過溝通避免,即使事發后也應該重新調整類名即時維護,避免后期造成因為對類的理解混淆而帶來維護上的復雜度提高)

 

namespace的使用方法

1、namespace后命名的定義不區分大小寫;一個PHP文件客房多個命名空間,第一個命名空間前不能有代碼;namespace建議用類名

 

2、沒有定義命名空間,就理解為使用頂級命名空間。new類時,可以在類前加上反斜杠\,也可以不加。

//1.php   
class Person{
    function __construct(){
            echo 'I am one!';
        }
}
//name.php
require_once './1.php';

new Person();     //輸出 I am one!;
new \Person(); //輸出 I am one!;

 

3、 new類時,當前定義了命名空間時,類名一定用反斜杠字符。

myday.php
<?php
class myday
{
    function mda(){
        echo "今天是星期五";
    }
}
Anlis.php
<?php
namespace one;
require('myday.php'); $day = new \myday();

這是因為當前已經定義了命名空間,如果new時類名不加“\”,它會默認加上one命名空間,會報以下錯誤:

Fatal error: Class 'one\myday' not found in C:\phpStudy\PHPTutorial\WWW\test\yidian\namespace\Anlis.php on line 5

 

4、 根命名空間和子命名空間

命名空間的調用語法像文件路徑一樣是有道理的,它允許我們自定義子空間來描述各個空間之間的關系。當前命名下調用別的命名空間的類時,使用了一種像文件路徑的語法: \空間名\元素名(類名)。

當然,也可以使article和message board這兩個模塊其實都是處於同一個blog項目內。如果用命名空間來表達它們的關系,是這樣:

<?php
//我用這樣的命名空間表示處於blog下的article模塊
namespace Blog\Article;

class Comment { }

//我用這樣的命名空間表示處於blog下的messageBoard模塊
namespace Blog\MessageBoard;

class Comment { }

//調用當前空間的類
$comment = new Comment();

//調用Blog\Article空間的類
$article_comment = new \Blog\Article\Comment();
?>

而且,子空間還可以定義很多層次,比如說 Blog\Article\Archives\Date

 

 

使用use的目的

在命名空間字符串過長時,使用use可以相應的縮短命名空間。

use的使用方法

1、new類時,最前面無需用反斜杠。此外,use后沒有as時,別名默認為最后一個反斜杠后的內容

<?php
namespace animal\dog;
class Life{
    function __construct(){
        echo 'dog life!<br>';
    }
}

namespace animal\cat;
class Life{
    function __construct(){
        echo 'cat life!<br>';
    }
}

//沒有使用use
new Life(); //按照代碼執行順序,這里默認animal\cat這個命名空間;輸出:cat life! new \animal\dog\Life(); //輸出:dog life! //使用use use animal\dog; new dog\Life(); //輸出:dog life! use animal\dog as d; //定義別名:d new d\Life(); //輸出:dog life!

使用use和沒有使用use區別

(1)、使用了use在當前命名空間下調用別的命名空間的元素,不加“\”也不會默認加上當前命名空間。

(2)、沒使用use時,不加“\”也會默認加上當前命名空間。

 

2、namespace后面不建議加類名,但use可以。

namespace animal\dog;
class Life{
    function __construct(){
        echo 'dog life!';
    }
}

namespace animal\cat;
class Life{
    function __construct(){
        echo 'cat life!';
    }
}

use animal\dog\Life as dog;
new dog();//輸出:dog life!

如上所示,use后加上類名后,就相當於把類改了個名稱:由Life改為dog了。

注:如果上面不用as dog就會報錯。因為命名空間cat下也有個一樣名稱的Life類,可以理解為,使用use后,這個昵稱對應的類只能歸當前命名空間占有,其它命名空間下不允許存在該類,所以use后加上類名必須加上as才不會報錯。

 

 總結:

1、namespace就是划分領域的作用,代表這些東西是屬於某個命名空間下的。

2、use就是起小名的作用,不論寫起來還是說起來都可以省不少事兒。

 參考鏈接:https://www.cnblogs.com/drunkhero/p/namespace.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM