真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在PHP中使用namespace與use命令空間-創(chuàng)新互聯(lián)

怎么在PHP中使用namespace與use命令空間?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)專(zhuān)注于中大型企業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)和網(wǎng)站改版、網(wǎng)站營(yíng)銷(xiāo)服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開(kāi)發(fā)的融合,累計(jì)客戶(hù)1000多家,服務(wù)滿(mǎn)意度達(dá)97%。幫助廣大客戶(hù)順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專(zhuān)注品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開(kāi)發(fā),在前進(jìn)的路上,與客戶(hù)一起成長(zhǎng)!

使用namespace的目的:


團(tuán)隊(duì)合作項(xiàng)目時(shí),避免與團(tuán)隊(duì)其它成員新建的類(lèi)發(fā)生沖突;個(gè)人負(fù)責(zé)項(xiàng)目時(shí),避免前后新建的類(lèi)發(fā)生沖突;

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

結(jié)合使用方法來(lái)進(jìn)一步理解它的使用目的吧。

namespace的使用方法:

為了進(jìn)行測(cè)試,我將創(chuàng)建3個(gè)文件:1.php和name.php(此文件用來(lái)執(zhí)行測(cè)試),后面將不再說(shuō)明,請(qǐng)自行注意代碼的變化。

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

namespace one;
namespace One;
namespace ONE;

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

2. 沒(méi)有定義命名空間,就理解為使用頂級(jí)命名空間。new類(lèi)時(shí),可以在類(lèi)前加上反斜杠\,也可以不加。

//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類(lèi)時(shí),帶上命名空間時(shí),之間一定用反斜杠字符,而不是順斜杠。

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

//name.php
require_once './1.php';
new /Person(); // 代碼報(bào)錯(cuò):Parse error: syntax error, unexpected '/'

4.類(lèi)在指定命名空間下, new類(lèi)時(shí),一定要帶上指定的命名空間。

沒(méi)有帶上指定的命名空間,按照第2點(diǎn),php就會(huì)從頂級(jí)命名空間里找這個(gè)類(lèi)。切記:這里不能按照頂級(jí)命名空間包含一切其它的命名空間來(lái)理解。而應(yīng)該將頂級(jí)命名空間完完全全與其他命名空間區(qū)分開(kāi)。

//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(); //代碼報(bào)錯(cuò):Fatal error: Class 'Person' not found

可以舉個(gè)這個(gè)通俗例子來(lái)理解:帶上指定命名空間代表某人的蘋(píng)果(在他手里),頂級(jí)命名空間代表蘋(píng)果箱里的蘋(píng)果(在箱子里)?,F(xiàn)在要找某人的蘋(píng)果,就將某人的命名空間帶上,否則就會(huì)從箱子里找某人的蘋(píng)果,結(jié)果當(dāng)然是找不到。

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

//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é)果會(huì)是什么呢,猜猜看

最后一行結(jié)果報(bào)錯(cuò):

Fatal error: Class 'test\Person' not found

首先,這里與第2點(diǎn)比較一下:

第2點(diǎn),我說(shuō),沒(méi)有命名空間時(shí),new類(lèi)時(shí),有沒(méi)有反斜杠意義一樣。

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

最后一行換成

new \Person();

結(jié)果報(bào)錯(cuò):

Fatal error: Class 'Person' not found

接著,就說(shuō)說(shuō)當(dāng)前這點(diǎn)。

我們可以發(fā)現(xiàn),最后一行代碼對(duì)應(yīng)的命名空間為test,并沒(méi)有受到require文件里的命名空間的影響。

進(jìn)一步加強(qiáng)驗(yà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é)果會(huì)是什么,自己猜猜看

最后,這個(gè)例子刷新了我對(duì)require的認(rèn)識(shí)了。

按照我以前對(duì)require的理解:PHP 程序在執(zhí)行前,就會(huì)先讀入 require 所指定引入的文件,使它變成 PHP 程序網(wǎng)頁(yè)的一部分。所以我常常就簡(jiǎn)單的理解為替換,只不過(guò)把抽離出來(lái)的代碼再放回原處而已。然后我試了將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!';
 }
}

無(wú)需new類(lèi),該文件就會(huì)報(bào)錯(cuò):

Fatal error:  Cannot redeclare class one\Person

看來(lái)簡(jiǎn)單的把require理解為替換,在這里行不通。

6.namespace里不包含類(lèi)名稱(chēng),即使存在與類(lèi)名稱(chēng)同名的部分,那也不代表類(lèi)。new類(lèi)時(shí),還是得將這部分帶上。

//name.php
namespace test\person;
class Person{
 function __construct(){
  echo 'I am test!';
 }
}new \test\person\Person();  //命名空間里person無(wú)法代表類(lèi)名

不過(guò)這樣純粹是畫(huà)蛇添足,直接干脆點(diǎn),namespace里不要帶類(lèi)名稱(chēng)就好。

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

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

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

php命名空間namespace告一段落了,接下來(lái)說(shuō)說(shuō)use的用途。

使用use的目的:

在命名空間字符串過(guò)長(zhǎng)時(shí),使用use可以相應(yīng)的縮短命名空間。

use的使用方法:

1.new類(lèi)時(shí),最前面無(wú)需用反斜杠。此外,use后沒(méi)有as時(shí),縮短的命名空間默認(rèn)為最后一個(gè)反斜杠后的內(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這個(gè)命名空間
new \animal\dog\Life(); //A
use animal\dog; //a
new dog\Life(); //B
use animal\dog as d; //b
new d\Life();

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

使用use后,new類(lèi)時(shí),最前面沒(méi)有反斜杠。

沒(méi)使用use時(shí),命名空間最前面有反斜杠

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

use后沒(méi)有as時(shí),縮短的命名空間默認(rèn)為最后一個(gè)反斜杠后的內(nèi)容。如上的:

use animal\dog;

相當(dāng)于

use animal\dog as dog;


2.namespace后面不建議加類(lèi)名,但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后加上類(lèi)名后,就相當(dāng)于把類(lèi)改了個(gè)名稱(chēng):由Life改為dog了。

上面不用as dog就會(huì)報(bào)錯(cuò):

Fatal error:  Cannot use animal\dog\Life as Life because the name is already in use
因?yàn)閏at下也有個(gè)一樣名稱(chēng)的Life類(lèi)。

可以理解為,使用use后,這個(gè)昵稱(chēng)對(duì)應(yīng)的類(lèi)只能歸當(dāng)前命名空間占有,其它命名空間下不允許存在該類(lèi)。

//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

通過(guò)上面代碼,我想使用use的目的效果(縮短命名空間名稱(chēng))就很明顯了。

簡(jiǎn)單總結(jié)一下:

namespace就是劃分領(lǐng)域的作用,代表這些東西是屬于某個(gè)命名空間下的。

關(guān)于怎么在PHP中使用namespace與use命令空間問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)頁(yè)名稱(chēng):怎么在PHP中使用namespace與use命令空間-創(chuàng)新互聯(lián)
瀏覽路徑:http://weahome.cn/article/ihjhp.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部