日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP命令空间namespace及use的用法实践总结

發(fā)布時間:2025/7/14 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP命令空间namespace及use的用法实践总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以下皆為本人自我理解內(nèi)容,如有失誤之處,請多多包涵。

?

文章大綱:

使用namespace的目的

namespace的使用方法

使用use的目的

use的使用方法

?

?

使用namespace的目的:

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

?

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


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

?

?

namespace的使用方法:

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

1.namespace后命名的定義不區(qū)分大小寫

namespace one;
namespace One;
namespace ONE;

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

?

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文件里的命名空間的影響。

進一步加強驗證,我修改了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的認識了。

按照我以前對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時,縮短的命名空間默認為最后一個反斜杠后的內(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í)行順序,這里默認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時,縮短的命名空間默認為最后一個反斜杠后的內(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)域的作用,代表這些東西是屬于某個命名空間下的。

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

?

參考鏈接:

1. PHP命名空間 namespace 及導(dǎo)入 use 的用法

2. 簡單易懂的命名空間及use的使用

該篇里的注意事項不難理解,如我所說,use就是個起昵稱的作用,自然無法相當(dāng)于include和require的引入文件的作用。

?

轉(zhuǎn)載于:https://www.cnblogs.com/drunkhero/p/namespace.html

總結(jié)

以上是生活随笔為你收集整理的PHP命令空间namespace及use的用法实践总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。