怎么在PHP中使用namespace與use命令空間?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)專注于中大型企業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶1000多家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長!使用namespace的目的:
團隊合作項目時,避免與團隊其它成員新建的類發(fā)生沖突;個人負(fù)責(zé)項目時,避免前后新建的類發(fā)生沖突;
據(jù)個人理解,用到所需要的類時,需要先require或include引入,所以會發(fā)生類重定義的錯誤的前提是:兩個相同命名的類都有被引入。目前有些php框架會自動加載(即include)所有新建的model類,所以為了避免你新建的model類和項目框架原生的核心類發(fā)生重名沖突,采用了namespace。(想了想,與團隊成員新建的類產(chǎn)生沖突應(yīng)該通過溝通避免,即使事發(fā)后也應(yīng)該重新調(diào)整類名即時維護(hù),避免后期造成因為對類的理解混淆而帶來維護(hù)上的復(fù)雜度提高)
結(jié)合使用方法來進(jìn)一步理解它的使用目的吧。
namespace的使用方法:
為了進(jìn)行測試,我將創(chuàng)建3個文件:1.php和name.php(此文件用來執(zhí)行測試),后面將不再說明,請自行注意代碼的變化。
1.namespace后命名的定義不區(qū)分大小寫
namespace one;
namespace One;
namespace ONE;
如上寫法都可以,選擇一種作為自己的規(guī)范即可。(后面代碼我采用第一種進(jìn)行測試哈)
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類時,帶上命名空間時,之間一定用反斜杠字符,而不是順斜杠。
記憶方法:按找%中斜杠的順序理解為順斜杠。(有時說反斜杠,自己都不知道是哪種方向,以前按自左向右上升方向這種方向記憶,現(xiàn)在感覺這個太不靠譜了)
//name.php require_once './1.php'; new /Person(); // 代碼報錯:Parse error: syntax error, unexpected '/'
4.類在指定命名空間下, new類時,一定要帶上指定的命名空間。
沒有帶上指定的命名空間,按照第2點,php就會從頂級命名空間里找這個類。切記:這里不能按照頂級命名空間包含一切其它的命名空間來理解。而應(yīng)該將頂級命名空間完完全全與其他命名空間區(qū)分開。
//1.php namespace one; class Person{ function __construct(){ echo 'I am one!'; } } //name.php require_once './1.php'; new \one\Person(); //輸出 I am one!; new \Person(); //代碼報錯:Fatal error: Class 'Person' not found
可以舉個這個通俗例子來理解:帶上指定命名空間代表某人的蘋果(在他手里),頂級命名空間代表蘋果箱里的蘋果(在箱子里)。現(xiàn)在要找某人的蘋果,就將某人的命名空間帶上,否則就會從箱子里找某人的蘋果,結(jié)果當(dāng)然是找不到。
5.命名空間聲明后的代碼便屬于這個命名空間,即使有include或require也不影響(重點是對后半句的理解,具體看代碼)。
//1.php namespace one; class Person{ function __construct(){ echo 'I am one!'; } } //name.php namespace test; require './1.php'; new \one\Person(); //輸出 I am one!; new Person(); //這里結(jié)果會是什么呢,猜猜看
最后一行結(jié)果報錯:
Fatal error: Class 'test\Person' not found
首先,這里與第2點比較一下:
第2點,我說,沒有命名空間時,new類時,有沒有反斜杠意義一樣。
在這里,有了命名空間,有和沒有反斜杠的意義就不一樣了。
最后一行換成
new \Person();
結(jié)果報錯:
Fatal error: Class 'Person' not found
接著,就說說當(dāng)前這點。
我們可以發(fā)現(xiàn),最后一行代碼對應(yīng)的命名空間為test,并沒有受到require文件里的命名空間的影響。
進(jìn)一步加強驗證,我修改了name.php文件如下:
//name.php namespace test; require './1.php'; class Person{ function __construct(){ echo 'I am test!'; } } new \one\Person(); //輸出 I am one!; new Person(); //這里結(jié)果會是什么,自己猜猜看
最后,這個例子刷新了我對require的認(rèn)識了。
按照我以前對require的理解:PHP 程序在執(zhí)行前,就會先讀入 require 所指定引入的文件,使它變成 PHP 程序網(wǎng)頁的一部分。所以我常常就簡單的理解為替換,只不過把抽離出來的代碼再放回原處而已。然后我試了將1.php文件內(nèi)容放到name.php里:
//name.php namespace test; namespace one; class Person{ function __construct(){ echo 'I am one!'; } } class Person{ function __construct(){ echo 'I am test!'; } }
無需new類,該文件就會報錯:
Fatal error: Cannot redeclare class one\Person
看來簡單的把require理解為替換,在這里行不通。
6.namespace里不包含類名稱,即使存在與類名稱同名的部分,那也不代表類。new類時,還是得將這部分帶上。
//name.php namespace test\person; class Person{ function __construct(){ echo 'I am test!'; } }new \test\person\Person(); //命名空間里person無法代表類名
不過這樣純粹是畫蛇添足,直接干脆點,namespace里不要帶類名稱就好。
7.一個php文件中可以存在多個命名空間,第一個命名空間前不能有任何代碼。
只說第一個命名空間前不能有任何代碼,之后的命名空間之前可以有代碼。這個自行測試即可。
//name.php namespace test; echo 'zhai14'; namespace zhai; require './1.php';
php命名空間namespace告一段落了,接下來說說use的用途。
使用use的目的:
在命名空間字符串過長時,使用use可以相應(yīng)的縮短命名空間。
use的使用方法:
1.new類時,最前面無需用反斜杠。此外,use后沒有as時,縮短的命名空間默認(rèn)為最后一個反斜杠后的內(nèi)容。
//name.php namespace animal\dog; class Life{ function __construct(){ echo 'dog life!'; } } namespace animal\cat; class Life{ function __construct(){ echo 'cat life!'; } } new Life(); //按照代碼執(zhí)行順序,這里默認(rèn)animal\cat這個命名空間 new \animal\dog\Life(); //A use animal\dog; //a new dog\Life(); //B use animal\dog as d; //b new d\Life();
通過A、B行代碼比較,需要注意:
使用use后,new類時,最前面沒有反斜杠。
沒使用use時,命名空間最前面有反斜杠
通過a、b行代碼比較,可以理解:
use后沒有as時,縮短的命名空間默認(rèn)為最后一個反斜杠后的內(nèi)容。如上的:
use animal\dog;
相當(dāng)于
use animal\dog as dog;
2.namespace后面不建議加類名,但use后可以。
//name.php 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();
如上所示,use后加上類名后,就相當(dāng)于把類改了個名稱:由Life改為dog了。
上面不用as dog就會報錯:
Fatal error: Cannot use animal\dog\Life as Life because the name is already in use
因為cat下也有個一樣名稱的Life類。
可以理解為,使用use后,這個昵稱對應(yīng)的類只能歸當(dāng)前命名空間占有,其它命名空間下不允許存在該類。
//name.php namespace animal\dog; class Life{ function __construct(){ echo 'dog life!'; } } class Dog{ function __construct(){ echo 'dog in dog!'; } } namespace animal\cat; // class Dog{ // function __construct(){ // echo 'dog in cat!'; // } // } class Life{ function __construct(){ echo 'cat life!'; } } use animal\dog; new dog\Dog();
如上,使用了
use animal\dog;
cat
通過上面代碼,我想使用use的目的效果(縮短命名空間名稱)就很明顯了。
簡單總結(jié)一下:
namespace就是劃分領(lǐng)域的作用,代表這些東西是屬于某個命名空間下的。
關(guān)于怎么在PHP中使用namespace與use命令空間問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
本文題目:怎么在PHP中使用namespace與use命令空間-創(chuàng)新互聯(lián)
本文來源:http://bm7419.com/article48/ihjhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、用戶體驗、網(wǎng)站設(shè)計公司、定制開發(fā)、品牌網(wǎng)站建設(shè)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容