使用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就是起小名的作用,不論寫起來還是說起來都可以省不少事兒。