假設 有文件a.php 代碼php
<?php class a{//類a public function afun()//函數afun { echo "aaaa"; } } ?>
有文件b.php 代碼php框架
<?php class a{//類a public function bfun()//函數bfun { echo "aaaa"; } } ?>
有文件c.php 如今有以下需求 框架
需求1:須要在c.php中調用afun()。函數
需求1很簡單 你們都懂 把a.php文件引入進來而後實例化a對象就行,require_once('a.php');ui
需求2:在c.php中調用bfun()spa
與上面同樣 require_once('b.php')就行。code
需求3:在c.php中同時調用afun()與bfun()對象
問題來了,若是同時require文件a,php,b.php那麼實例化對象時class a究竟是a.php中的仍是b.php的?(哪些鑽牛角尖說你不會把b.php中的class a換成其餘名字 請繞道!);因而爲了方便管理類引入了命名空間namespace。blog
好下面 咱們修改文件a.php b.php 代碼加入命名空間!get
a.php:
<?php namespace ns\a;//定義命名空間 class a{//類a public function afun()//函數afun { echo "aaaa"; } } ?>
b.php:
<?php namespace ns\b;//定義命名空間 class a{//類a public function bfun()//函數bfun { echo "aaaa"; } } ?>
因而在c.php中咱們就能夠引用上面定義命名空間 怎麼引用?這是關鍵字use就出來了!
c.php:在c.php同時調用afun,bfun
<?php require_once('a.php');//引入文件a.php require_once('\b.php');//引入文件a.php use ns\a\a as a; //使用命名空間ns\a中的類a 並用a替換 use ns\b\a as b;//使用命名空間ns\b中的類a 並用b替換 $a=new a();//實例化a.php 中的類a $a->afun(); $a=new b();//例化b.php 中的類a $a->bfun();
上面的例子應該足以說明namespace 、 use的關係
下面總結下:
能夠這樣理解 namespace 命名空間是爲了方便管理類而引入的機制,咱們能夠將功能相近的類都放在同一命名空間下,在使用時直接引入該空間就能夠了,簡單的說namespace 就是將裏面的類打個包。好比下面代碼:
namespace my\test; class a { public function test() { echo "aaaa"; } } class c { public function test() { echo "aaaa"; } }
咱們經過命名空間就能夠把類a與類c歸集在一塊兒。固然類a與類c能夠在不一樣的文件中定義只要它們的命名空間相同 它們就會歸集在一塊兒。這樣的機制下咱們會發現之後類的組織會很清晰!咱們把類經過namespace "打包"後 在使用時 只要經過use引入該「包」便可調用該類!若是咱們項目的文件不少、類成千上萬 那麼對類的管理相當重要,這也是爲何不少php框架都用命名空間的緣由,固然了你本身寫小項目玩玩就不須要用了!
注意:
關鍵字namespace後面跟的是名稱 不是路徑!咱們看到不少框架 namespace 後面都跟着「路徑」實際上是爲了讓咱們知道該命名空間所在的文件位置 當咱們文件不少時,這樣的名稱會方便咱們查找。
關鍵字use使用時後面通常跟類名 好比:
use a\b //表示使用命名空間下的類b
use a\b as c //表示使用命名空間下的類b 並額外賦予額外標示c 便可以把c但類b使用
其實use 能夠不使用!如在上面的例子文件a.php中咱們使用class a;
use ns\a as a;
$a=new a();
等同於:
$a=new ns\a\a();
還有namespace use與require_once(include相似)做用徹底不一樣!不少人覺得use就是把文件包含進來 這是錯誤的觀點!甚至還有人認爲有use就不須要require了,這樣的觀點只能說明根本不瞭解命名空間的用途!試想一下咱們要使用use若是連命名空間在哪裏都不知道,那麼怎麼使用類?因此若是命名空間在其餘文件中必須使用require(include)先將文件包含進來!