亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP命令空間namespace及use的用法小結

2024-05-05 00:01:16
字體:
來源:轉載
供稿:網友

命名空間一個最明確的目的就是解決重名問題,PHP中不允許兩個函數或者類出現相同的名字,否則會產生一個致命的錯誤。這種情況下只要避免命名重復就可以解決,最常見的一種做法是約定一個前綴。

使用namespace的目的:

團隊合作項目時,避免與團隊其它成員新建的類發生沖突;個人負責項目時,避免前后新建的類發生沖突;

據個人理解,用到所需要的類時,需要先require或include引入,所以會發生類重定義的錯誤的前提是:兩個相同命名的類都有被引入。目前有些php框架會自動加載(即include)所有新建的model類,所以為了避免你新建的model類和項目框架原生的核心類發生重名沖突,采用了namespace。(想了想,與團隊成員新建的類產生沖突應該通過溝通避免,即使事發后也應該重新調整類名即時維護,避免后期造成因為對類的理解混淆而帶來維護上的復雜度提高)

結合使用方法來進一步理解它的使用目的吧。

namespace的使用方法:

為了進行測試,我將創建3個文件:1.php和name.php(此文件用來執行測試),后面將不再說明,請自行注意代碼的變化。

1.namespace后命名的定義不區分大小寫

namespace one;
namespace One;
namespace ONE;

如上寫法都可以,選擇一種作為自己的規范即可。(后面代碼我采用第一種進行測試哈)

2. 沒有定義命名空間,就理解為使用頂級命名空間。new類時,可以在類前加上反斜杠/,也可以不加。

//1.php class Person{ function __construct(){  echo 'I am one!'; }}//name.phprequire_once './1.php';new Person(); //輸出 I am one!;new /Person(); //輸出 I am one!; 

3. new類時,帶上命名空間時,之間一定用反斜杠字符,而不是順斜杠。

記憶方法:按找%中斜杠的順序理解為順斜杠。(有時說反斜杠,自己都不知道是哪種方向,以前按自左向右上升方向這種方向記憶,現在感覺這個太不靠譜了)

//name.phprequire_once './1.php';new /Person(); // 代碼報錯:Parse error: syntax error, unexpected '/'

4.類在指定命名空間下, new類時,一定要帶上指定的命名空間。

沒有帶上指定的命名空間,按照第2點,php就會從頂級命名空間里找這個類。切記:這里不能按照頂級命名空間包含一切其它的命名空間來理解。而應該將頂級命名空間完完全全與其他命名空間區分開。

//1.php namespace one;class Person{ function __construct(){  echo 'I am one!'; }}//name.phprequire_once './1.php';new /one/Person(); //輸出 I am one!;new /Person(); //代碼報錯:Fatal error: Class 'Person' not found

可以舉個這個通俗例子來理解:帶上指定命名空間代表某人的蘋果(在他手里),頂級命名空間代表蘋果箱里的蘋果(在箱子里)?,F在要找某人的蘋果,就將某人的命名空間帶上,否則就會從箱子里找某人的蘋果,結果當然是找不到。

5.命名空間聲明后的代碼便屬于這個命名空間,即使有include或require也不影響(重點是對后半句的理解,具體看代碼)。

//1.php namespace one;class Person{ function __construct(){  echo 'I am one!'; }}//name.phpnamespace test;require './1.php'; new /one/Person(); //輸出 I am one!;new Person(); //這里結果會是什么呢,猜猜看

最后一行結果報錯:

Fatal error: Class 'test/Person' not found

首先,這里與第2點比較一下:

第2點,我說,沒有命名空間時,new類時,有沒有反斜杠意義一樣。

在這里,有了命名空間,有和沒有反斜杠的意義就不一樣了。

最后一行換成

new /Person(); 

結果報錯:

Fatal error: Class 'Person' not found

接著,就說說當前這點。

我們可以發現,最后一行代碼對應的命名空間為test,并沒有受到require文件里的命名空間的影響。

進一步加強驗證,我修改了name.php文件如下:

//name.phpnamespace test;require './1.php'; class Person{ function __construct(){  echo 'I am test!'; }}new /one/Person(); //輸出 I am one!;new Person(); //這里結果會是什么,自己猜猜看 

最后,這個例子刷新了我對require的認識了。

按照我以前對require的理解:PHP 程序在執行前,就會先讀入 require 所指定引入的文件,使它變成 PHP 程序網頁的一部分。所以我常常就簡單的理解為替換,只不過把抽離出來的代碼再放回原處而已。然后我試了將1.php文件內容放到name.php里:

//name.phpnamespace 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.phpnamespace test/person;class Person{ function __construct(){  echo 'I am test!'; }}new /test/person/Person();  //命名空間里person無法代表類名

不過這樣純粹是畫蛇添足,直接干脆點,namespace里不要帶類名稱就好。

7.一個php文件中可以存在多個命名空間,第一個命名空間前不能有任何代碼。

只說第一個命名空間前不能有任何代碼,之后的命名空間之前可以有代碼。這個自行測試即可。

//name.phpnamespace test;echo 'zhai14';namespace zhai;require './1.php'; 

php命名空間namespace告一段落了,接下來說說use的用途。

使用use的目的:

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

use的使用方法:

1.new類時,最前面無需用反斜杠。此外,use后沒有as時,縮短的命名空間默認為最后一個反斜杠后的內容。

//name.phpnamespace animal/dog;class Life{ function __construct(){  echo 'dog life!'; }}namespace animal/cat;class Life{ function __construct(){  echo 'cat life!'; }}new Life(); //按照代碼執行順序,這里默認animal/cat這個命名空間new /animal/dog/Life(); //Ause animal/dog; //anew dog/Life(); //Buse animal/dog as d; //bnew d/Life();

 通過A、B行代碼比較,需要注意:

使用use后,new類時,最前面沒有反斜杠。

沒使用use時,命名空間最前面有反斜杠

通過a、b行代碼比較,可以理解:

use后沒有as時,縮短的命名空間默認為最后一個反斜杠后的內容。如上的:

use animal/dog;

相當于

use animal/dog as dog; 

2.namespace后面不建議加類名,但use后可以。

//name.phpnamespace 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后加上類名后,就相當于把類改了個名稱:由Life改為dog了。

上面不用as dog就會報錯:

Fatal error:  Cannot use animal/dog/Life as Life because the name is already in use
因為cat下也有個一樣名稱的Life類。

可以理解為,使用use后,這個昵稱對應的類只能歸當前命名空間占有,其它命名空間下不允許存在該類。

//name.phpnamespace 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的目的效果(縮短命名空間名稱)就很明顯了。

簡單總結一下:

namespace就是劃分領域的作用,代表這些東西是屬于某個命名空間下的。

use就是起小名的作用,不論寫起來還是說起來都可以省不少事兒。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品推荐| xxxx欧美18另类的高清| 久久久久久久成人| 日韩欧美中文免费| 国语自产偷拍精品视频偷| 成人精品在线视频| 欧美精品18videosex性欧美| 日韩av免费看网站| 久久久之久亚州精品露出| 久久亚洲精品中文字幕冲田杏梨| 欧美精品第一页在线播放| 国产精品日韩在线| 欧美另类极品videosbest最新版本| 最近2019年好看中文字幕视频| 俺去亚洲欧洲欧美日韩| 亚洲国产精品高清久久久| 色哟哟入口国产精品| 国产精品丝袜一区二区三区| 国产精品aaa| 欧美伊久线香蕉线新在线| 91久久中文字幕| 国产精品视频专区| 欧美乱大交xxxxx| 欧美在线精品免播放器视频| 色777狠狠综合秋免鲁丝| 日韩视频免费看| 日韩视频第一页| 日韩美女免费视频| 欧美黄色免费网站| 欧美日韩性生活视频| 日韩av在线免费| 精品欧美aⅴ在线网站| 欧美日韩一区二区免费视频| 国产成人综合久久| 一区二区欧美亚洲| 亚洲男人天堂久| 欧美激情伊人电影| 国产精品国模在线| 亚洲精品国产品国语在线| 在线观看中文字幕亚洲| 一区二区三区日韩在线| 日韩免费在线视频| 中文字幕免费精品一区高清| 午夜伦理精品一区| 日本一区二区在线免费播放| 亚洲2020天天堂在线观看| 亚洲欧美国内爽妇网| 色噜噜亚洲精品中文字幕| 国产91在线播放九色快色| 久久久久久久电影一区| 亚洲天堂日韩电影| 亚洲欧美日韩在线一区| 国产精品美女视频网站| 欧美日韩免费网站| 97视频在线播放| 777国产偷窥盗摄精品视频| 亚洲国产高清福利视频| 亚洲四色影视在线观看| 国产精品免费小视频| 欧美激情二区三区| 97免费在线视频| 日韩国产欧美精品在线| 精品日本高清在线播放| 日韩免费在线视频| 国产精品专区h在线观看| 中文字幕欧美亚洲| 成人在线视频福利| 日韩精品免费在线视频| 中文欧美日本在线资源| 国产精品久久久久久久久久99| 日韩精品视频观看| 岛国视频午夜一区免费在线观看| 国产成人久久久精品一区| 亚洲成人av中文字幕| 亚洲欧美精品中文字幕在线| 中文字幕精品一区久久久久| 色琪琪综合男人的天堂aⅴ视频| 最近2019中文字幕一页二页| 国产精品高清在线观看| 欧美激情啊啊啊| 欧美超级免费视 在线| 中文字幕av一区| 亚洲欧美激情在线视频| 欧美日韩国产123| 欧美精品日韩www.p站| 国产精品日韩欧美综合| 精品久久久91| 992tv在线成人免费观看| 亚洲天堂视频在线观看| 精品欧美一区二区三区| 精品久久久久久久久中文字幕| 亚洲天堂2020| 国产一区二区黑人欧美xxxx| 91深夜福利视频| 91福利视频在线观看| 精品美女永久免费视频| 久久夜色撩人精品| 久久久精品免费| 日本高清不卡的在线| 亚洲美女www午夜| 久久久久久噜噜噜久久久精品| 欧美一级淫片丝袜脚交| 亚洲一区二区三区xxx视频| 1769国内精品视频在线播放| 久久精品国产精品| 国产精品伦子伦免费视频| 精品调教chinesegay| 国产丝袜精品第一页| 久久久久女教师免费一区| 国产午夜一区二区| 欧日韩不卡在线视频| 久久91超碰青草是什么| 日韩中文字幕在线| 国产精品永久免费| 欧美成人午夜激情在线| 日韩精品极品视频免费观看| 欧美性xxxx极品高清hd直播| 久久久女人电视剧免费播放下载| 精品国产一区二区在线| 最近2019年日本中文免费字幕| 日本国产欧美一区二区三区| 精品国产乱码久久久久酒店| 亚洲一区二区日本| 日韩精品视频在线观看网址| 97在线观看免费| 一本色道久久88综合亚洲精品ⅰ| 91av国产在线| 青青草原成人在线视频| 另类少妇人与禽zozz0性伦| 欧美专区第一页| 欧美精品制服第一页| 久久久精品国产一区二区| 日韩精品福利网站| 日韩有码视频在线| 国产福利精品av综合导导航| 欧美成人免费大片| 91九色国产社区在线观看| 日韩av在线高清| 九九久久久久久久久激情| 亚洲男人的天堂网站| 精品亚洲一区二区| 久久久999精品| 亚洲色图第一页| 精品视频在线播放免| 国产精品欧美在线| 欧美老少做受xxxx高潮| 欧美黄网免费在线观看| 久久久久日韩精品久久久男男| 日韩在线免费观看视频| 国产一区私人高清影院| 久久99久久久久久久噜噜| 欧美性资源免费| 国产成人综合一区二区三区| 国产精品大片wwwwww| 国产精品精品久久久| 青青久久av北条麻妃海外网| 午夜精品久久久久久99热| 欧美日韩精品在线| 中文字幕日韩欧美在线视频| 成人精品在线视频| 亚洲999一在线观看www| 日韩电影免费观看在线| 亚洲xxxx在线| 91地址最新发布|