使用namespace的目的php
命名空間將代碼劃分出不一樣的空間(區域),每一個空間的常量、函數、類(爲了偷懶,我下邊都將它們稱爲元素)的名字互不影響, 這個有點相似咱們經常提到的'封裝'的概念。html
團隊合做項目時,避免與團隊其它成員新建的類發生衝突;我的負責項目時,避免先後新建的類發生衝突;php框架
據我的理解,用到所須要的類時,須要先require或include引入,因此會發生類重定義的錯誤的前提是:兩個相同命名的類都有被引入。目前有些php框架會自動加載(即include)全部新建的model類,因此爲了不你新建的model類和項目框架原生的核心類發生重名衝突,採用了namespace。(想了想,與團隊成員新建的類產生衝突應該經過溝通避免,即便事發後也應該從新調整類名即時維護,避免後期形成由於對類的理解混淆而帶來維護上的複雜度提升)框架
namespace的使用方法函數
一、namespace後命名的定義不區分大小寫;一個PHP文件客房多個命名空間,第一個命名空間前不能有代碼;namespace建議用類名ui
二、沒有定義命名空間,就理解爲使用頂級命名空間。new類時,能夠在類前加上反斜槓\,也能夠不加。spa
//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!;
三、 new類時,當前定義了命名空間時,類名必定用反斜槓字符。code
myday.php
<?php
class myday { function mda(){ echo "今天是星期五"; } }
Anlis.php
<?php
namespace one;
require('myday.php'); $day = new \myday();
這是由於當前已經定義了命名空間,若是new時類名不加「\」,它會默認加上one命名空間,會報如下錯誤:
htm
Fatal error: Class 'one\myday' not found in C:\phpStudy\PHPTutorial\WWW\test\yidian\namespace\Anlis.php on line 5
四、 根命名空間和子命名空間blog
命名空間的調用語法像文件路徑同樣是有道理的,它容許咱們自定義子空間來描述各個空間之間的關係。當前命名下調用別的命名空間的類時,使用了一種像文件路徑的語法: \空間名\元素名(類名)。
固然,也可使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能夠相應的縮短命名空間。
一、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時,不加「\」也會默認加上當前命名空間。
二、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纔不會報錯。
總結:
一、namespace就是劃分領域的做用,表明這些東西是屬於某個命名空間下的。
二、use就是起小名的做用,不論寫起來仍是提及來均可以省很多事兒。