PHP命令空間namespace及use的用法

使用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的目的

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

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就是起小名的做用,不論寫起來仍是提及來均可以省很多事兒。

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

相關文章
相關標籤/搜索