結(jié)合設(shè)計(jì)經(jīng)驗(yàn)與營銷實(shí)踐,提供有價(jià)值的互聯(lián)網(wǎng)資訊
發(fā)布日期:2019-10-28瀏覽次數(shù):1602 來源:福州網(wǎng)站建設(shè)
假設(shè) 有文件a.php 代碼
<?php class a{//類a public function afun()//函數(shù)afun { echo "aaaa"; } } ?>
有文件b.php 代碼
<?php class a{//類a public function bfun()//函數(shù)bfun { echo "aaaa"; } } ?>
有文件c.php 現(xiàn)在有如下需求
需求1:需要在c.php中調(diào)用afun()。
需求1很簡(jiǎn)單 大家都懂 把a(bǔ).php文件引入進(jìn)來然后實(shí)例化a對(duì)象就行,require_once('a.php');
需求2:在c.php中調(diào)用bfun()
與上面一樣 require_once('b.php')就行。
需求3:在c.php中同時(shí)調(diào)用afun()與bfun()
問題來了,如果同時(shí)require文件a,php,b.php那么實(shí)例化對(duì)象時(shí)class a到底是a.php中的還是b.php的?(哪些鉆牛角尖說你不會(huì)把b.php中的class a換成其他名字 請(qǐng)繞道!);于是為了方便管理類引入了命名空間namespace。
好下面 我們修改文件a.php b.php 代碼加入命名空間!
a.php:
<?php namespace ns\a;//定義命名空間 class a{//類a public function afun()//函數(shù)afun { echo "aaaa"; } } ?>
b.php:
<?php namespace ns\b;//定義命名空間 class a{//類a public function bfun()//函數(shù)bfun { echo "aaaa"; } } ?>
于是在c.php中我們就可以引用上面定義命名空間 怎么引用?這是關(guān)鍵字use就出來了!
c.php:在c.php同時(shí)調(diào)用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();//實(shí)例化a.php 中的類a $a->afun(); $a=new b();//例化b.php 中的類a $a->bfun();
上面的例子應(yīng)該足以說明namespace 、 use的關(guān)系
下面總結(jié)下:
可以這樣理解 namespace 命名空間是為了方便管理類而引入的機(jī)制,我們可以將功能相近的類都放在同一命名空間下,在使用時(shí)直接引入該空間就可以了,簡(jiǎn)單的說namespace 就是將里面的類打個(gè)包。比如下面代碼:
namespace my\test; class a { public function test() { echo "aaaa"; } } class c { public function test() { echo "aaaa"; } }
我們通過命名空間就可以把類a與類c歸集在一起。當(dāng)然類a與類c可以在不同的文件中定義只要它們的命名空間相同 它們就會(huì)歸集在一起。這樣的機(jī)制下我們會(huì)發(fā)現(xiàn)以后類的組織會(huì)很清晰!我們把類通過namespace "打包"后 在使用時(shí) 只要通過use引入該“包”即可調(diào)用該類!如果我們項(xiàng)目的文件很多、類成千上萬 那么對(duì)類的管理至關(guān)重要,這也是為什么很多php框架都用命名空間的原因,當(dāng)然了你自己寫小項(xiàng)目玩玩就不需要用了!
注意:
關(guān)鍵字namespace后面跟的是名稱 不是路徑!我們看到很多框架 namespace 后面都跟著“路徑”其實(shí)是為了讓我們知道該命名空間所在的文件位置 當(dāng)我們文件很多時(shí),這樣的名稱會(huì)方便我們查找。
關(guān)鍵字use使用時(shí)后面一般跟類名 比如:
use a\b //表示使用命名空間下的類b
use a\b as c //表示使用命名空間下的類b 并額外賦予額外標(biāo)示c 即可以把c但類b使用
其實(shí)use 可以不使用!如在上面的例子文件a.php中我們使用class a;
use ns\a as a;
$a=new a();
等同于:
$a=new ns\a\a();
還有namespace use與require_once(include類似)作用完全不同!很多人以為use就是把文件包含進(jìn)來 這是錯(cuò)誤的觀點(diǎn)!甚至還有人認(rèn)為有use就不需要require了,這樣的觀點(diǎn)只能說明根本不了解命名空間的用途!試想一下我們要使用use如果連命名空間在哪里都不知道,那么怎么使用類?所以如果命名空間在其他文件中必須使用require(include)先將文件包含進(jìn)來!
以上是由福州網(wǎng)站建設(shè)的小編為你分享了"PHP namespace、require、use區(qū)別"文章,如果你在這方面有什么問題,隨時(shí)聯(lián)系我們