一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP 5.3新特性命名空間規(guī)則解析及高級(jí)功能

日前發(fā)布的php 5.3中,最重要的一個(gè)新特性就是命名空間的加入。本文介紹了php命名空間的一些術(shù)語(yǔ),其解析規(guī)則,以及一些高級(jí)功能的應(yīng)用,希望能夠幫助讀者在項(xiàng)目中真正使用命名空間。

在這里中我們介紹了php命名空間的用途和namespace關(guān)鍵字,在這篇文章中我們將介紹一下use命令的使用以及php如何解析命名空間的名字的。

為了便于對(duì)比,我定義了兩個(gè)幾乎一樣的代碼塊,只有命名空間的名字不同。

  1. < ?php  
  2. // application library 1  
  3. namespace App/Lib1;  
  4. const MYCONST = 'App/Lib1/MYCONST';  
  5. function MyFunction() {  
  6.  return __FUNCTION__;  
  7. }  
  8. class MyClass {  
  9.  static function WhoAmI() {  
  10. eturn __METHOD__;  
  11.  }  
  12. }  
  13. ?>

lib2.php

  1. < ?php  
  2. // application library 2  
  3. namespace App/Lib2;  
  4. const MYCONST = 'App/Lib2/MYCONST';  
  5. function MyFunction() {  
  6.  return __FUNCTION__;  
  7. }  
  8. class MyClass {  
  9.  static function WhoAmI() {  
  10. eturn __METHOD__;  
  11.  }  
  12. }  
  13. ?> 

開(kāi)始之前先要理解幾個(gè)php命名空間相關(guān)術(shù)語(yǔ)。

◆完全限定名稱(chēng)(Fully-qualified name)

任何php代碼都可以引用完全限定名稱(chēng),它是一個(gè)以命名空間反斜線開(kāi)頭的標(biāo)識(shí)符,如/App/Lib1/MYCONST,/App/Lib2/MyFunction( )等。

完全限定名稱(chēng)是沒(méi)有任何歧義的,開(kāi)頭的反斜線和文件路徑的作用有點(diǎn)類(lèi)似,它表示“根”全局空間,如果我們?cè)谌挚臻g中實(shí)現(xiàn)了一個(gè)不同的MyFunction( ),可以使用/MyFunction( )從lib1.php或lib2.php調(diào)用它。

完全限定名稱(chēng)對(duì)一次性函數(shù)調(diào)用或?qū)ο蟪跏蓟浅S杏茫?dāng)你產(chǎn)生了大量的調(diào)用時(shí)它們就沒(méi)有實(shí)用價(jià)值了,在下面的討論中我們將會(huì)看到,php提供了其它選項(xiàng)以解除我們?yōu)槊臻g打字的煩惱。

◆限定名稱(chēng)(Qualified name)

至少有一個(gè)命名空間分隔符的標(biāo)識(shí)符,如Lib1/MyFunction( )。

◆非限定名稱(chēng)(Unqualified name)

沒(méi)有命名空間分隔符的標(biāo)識(shí)符,如MyFunction( )。

在相同的命名空間內(nèi)工作

仔細(xì)思考下面的代碼:

myapp1.php

  1. < ?php  
  2. namespace App/Lib1;  
  3.  
  4. require_once('lib1.php');  
  5. require_once('lib2.php');  
  6.  
  7. header('Content-type: text/plain');  
  8. echo MYCONST . "/n";  
  9. echo MyFunction() . "/n";  
  10. echo MyClass::WhoAmI() . "/n";  
  11. ?>  

即使我們同時(shí)包括了lib1.php和lib2.php,MYCONST,MyFunction和MyClass標(biāo)識(shí)符只能在lib1.php中引用,這是因?yàn)閙yapp1.php的代碼在相同的App/Lib1命名空間內(nèi)。

執(zhí)行結(jié)果:

  1. App/Lib1/MYCONST  
  2. App/Lib1/MyFunction  
  3. App/Lib1/MyClass::WhoAmI  

命名空間導(dǎo)入

可以使用use操作符導(dǎo)入命名空間,如:

myapp2.php

 < ?php  
  1. use App/Lib2;  
  2. require_once('lib1.php');  
  3. require_once('lib2.php');  
  4. header('Content-type: text/plain');  
  5. echo Lib2/MYCONST . "/n";  
  6. echo Lib2/MyFunction() . "/n";  
  7. echo Lib2/MyClass::WhoAmI() . "/n";  
  8. ?>
 

可以定義任意數(shù)量的use語(yǔ)句,或使用逗號(hào)分隔成獨(dú)立的命名空間,在這個(gè)例子中我們導(dǎo)入了App/Lib2命名空間,但我們?nèi)匀徊荒苤苯右?MYCONST,MyFunction和MyClass,因?yàn)槲覀兊拇a還在全局空間中,但如果我們添加了“Lib2/”前綴,它們就變成限定名稱(chēng) 了,php將會(huì)搜索導(dǎo)入的命名空間,直到找到匹配項(xiàng)。

執(zhí)行結(jié)果:

  1. App/Lib2/MYCONST  
  2. App/Lib2/MyFunction  
  3. App/Lib2/MyClass::WhoAmI 

命名空間別名

命名空間別名可能是最有用的構(gòu)想了,別名允許我們使用較短的名稱(chēng)引用很長(zhǎng)的命名空間。

myapp3.php

  1. < ?php  
  2. use App/Lib1 as L;  
  3. use App/Lib2/MyClass as Obj;  
  4. header('Content-type: text/plain');  
  5. require_once('lib1.php');  
  6. require_once('lib2.php');  
  7. echo L/MYCONST . "/n";  
  8. echo L/MyFunction() . "/n";  
  9. echo L/MyClass::WhoAmI() . "/n";  
  10. echo Obj::WhoAmI() . "/n";  
  11. ?>  

第一個(gè)use語(yǔ)句將App/Lib1定義為“L”,任何使用“L”的限定名稱(chēng)在編譯時(shí)都會(huì)被翻譯成“App/Lib1”,因此我們就可以引用L/MYCONST和L/MyFunction而不是完全限定名稱(chēng)了。

第二個(gè)use語(yǔ)句定義了“obj”作為App/Lib2/命名空間中MyClass類(lèi)的別名,這種方式只適合于類(lèi),不能用于常量和函數(shù),現(xiàn)在我們就可以使用new Obj( )或象上面那樣運(yùn)行靜態(tài)方法了。

執(zhí)行結(jié)果:

  1. App/Lib1/MYCONST  
  2. App/Lib1/MyFunction  
  3. App/Lib1/MyClass::WhoAmI  
  4. App/Lib2/MyClass::WhoAmI  

php命名解析規(guī)則

php標(biāo)識(shí)符名稱(chēng)使用下列命名空間規(guī)則進(jìn)行解析,請(qǐng)參考php用戶手冊(cè)了解更詳細(xì)的信息:

1.在編譯時(shí)調(diào)用完全限定函數(shù)、類(lèi)或常量;

2.非限定名稱(chēng)和限定名稱(chēng)根據(jù)導(dǎo)入規(guī)則進(jìn)行翻譯,例如,如果A/B/C導(dǎo)入為C,調(diào)用C/D/e( )就會(huì)被翻譯成A/B/C/D/e( );

3.在php命名空間內(nèi),所有限定名稱(chēng)尚未根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換,例如,如果在命名空間A/B中調(diào)用C/D/e( ),那么會(huì)被翻譯成A/B/C/D/e( );

4.非限定類(lèi)名稱(chēng)根據(jù)當(dāng)前的導(dǎo)入規(guī)則進(jìn)行轉(zhuǎn)換,使用全名替換導(dǎo)入的短名稱(chēng),例如,如果類(lèi)C在命名空間A/B中被導(dǎo)入為X,那么new X( )就會(huì)被翻譯為new A/B/C( );

5.在命名空間中非限定函數(shù)調(diào)用在運(yùn)行時(shí)解析,例如,如果MyFunction( )在命名空間A/B中被調(diào)用,php首先會(huì)查找函數(shù)/A/B/MyFunction( ),如果沒(méi)有找到,然后會(huì)在全局空間中查找/MyFunction( );

6.調(diào)用非限定或限定類(lèi)名在運(yùn)行時(shí)被解析,例如,如果我們?cè)诿臻gA/B中調(diào)用new C( ),php將會(huì)查找類(lèi)A/B/C,如果沒(méi)有找到,php會(huì)嘗試自動(dòng)載入A/B/C。


php命名空間高級(jí)特性

接下來(lái)讓我們看一看php命名空間的一些高級(jí)特性。

__NAMESPACE__常量

__NAMESPACE__是一個(gè)php字符串,它總是返回當(dāng)前命名空間的名稱(chēng),在全局空間中它是一個(gè)空字符串。

  1. < ?php  
  2. namespace App/Lib1;  
  3. echo __NAMESPACE__; // outputs: App/Lib1  
  4. ?>  
  5.  

這個(gè)值在調(diào)試時(shí)非常有用,它也可由于動(dòng)態(tài)生成一個(gè)完全限定類(lèi)名,如:

  1. < ?php  
  2. namespace App/Lib1;  
  3.  
  4. class MyClass {  
  5.  public function WhoAmI() {  
  6. return __METHOD__;  
  7.  }  
  8. }  
  9.  
  10. $c = __NAMESPACE__ . '//MyClass';  
  11. $m = new $c;  
  12. echo $m->WhoAmI(); // outputs: App/Lib1/MyClass::WhoAmI  
  13. ?>  

namespace關(guān)鍵字

namespace關(guān)鍵字可以用于明確引用一個(gè)當(dāng)前命名空間或子命名空間中的項(xiàng)目,它等價(jià)于類(lèi)中的self命名空間:

  1. < ?php  
  2. namespace App/Lib1;  
  3.  
  4. class MyClass {  
  5.  public function WhoAmI() {  
  6. return __METHOD__;  
  7.  }  
  8. }  
  9.  
  10. $m = new namespace/MyClass;  
  11. echo $m->WhoAmI(); // outputs: App/Lib1/MyClass::WhoAmI  
  12. ?>  

自動(dòng)載入命名空間類(lèi)

php 5中最省時(shí)省力的特性是自動(dòng)載入,在全局(非命名空間)php代碼中,可以寫(xiě)一個(gè)標(biāo)準(zhǔn)自動(dòng)載入函數(shù):

  1. < ?php  
  2. $objnew MyClass1(); // classes/MyClass1.php is auto-loaded  
  3. $objnew MyClass2(); // classes/MyClass2.php is auto-loaded  
  4.  
  5. // autoload function  
  6. function __autoload($class_name) {  
  7.  require_once("classes/$class_name.php");  
  8. }  
  9. ?>  

php 5.3中,你可以創(chuàng)建一個(gè)命名空間類(lèi)的實(shí)例,在這種情況下,完全限定命名空間和類(lèi)名傳遞給__autoload函數(shù),例如,$class_name的值可 能是App/Lib1/MyClass。你可以在相同的文件夾下放置所有的php類(lèi)文件,從字符串中提取命名空間,但那樣會(huì)導(dǎo)致文件名沖突。

另外,你的類(lèi)文件層次結(jié)構(gòu)會(huì)按照命名空間的結(jié)構(gòu)重新組織,例如,MyClass.php文件可以創(chuàng)建在/classes/App/Lib1文件夾下:

/classes/App/Lib1/MyClass.php

  1. < ?php  
  2. namespace App/Lib1;  
  3.  
  4. class MyClass {  
  5.  public function WhoAmI() {  
  6. return __METHOD__;  
  7.  }  
  8. }  
  9. ?>  

在根文件夾下的文件就使用下面的代碼了:

myapp.php

  1. < ?php  
  2. use App/Lib1/MyClass as MC;  
  3.  
  4. $obj = new MC();  
  5. echo $obj->WhoAmI();  
  6.  
  7. // autoload function  
  8. function __autoload($class) {  
  9.  // convert namespace to full file path  
  10.  $class = 'classes/' . str_replace('//', '/', $class) . '.php';  
  11.  require_once($class);  
  12. }  
  13. ?>  

解釋?zhuān)?/P>

1.類(lèi)App/Lib1/MyClass的別名是MC;

2. new MC( )在編譯時(shí)被翻譯成new App/Lib1/MyClass( );

3.字符串App/Lib1/MyClass被傳遞給__autoload函數(shù),使用文件路徑正斜線替換所有命名空間中的反斜線,然后修改字符串,classes/App/Lib1/MyClass.php文件被自動(dòng)載入;

總結(jié)

有關(guān)php命名空間的使用就介紹到這里,希望您能夠?qū)?a href=/itjie/phpjishu/ target=_blank class=infotextkey>php的命名空間有一個(gè)新的認(rèn)識(shí),并希望你能在新項(xiàng)目中真正使用命名空間。

php技術(shù)PHP 5.3新特性命名空間規(guī)則解析及高級(jí)功能,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 一区二区三区视频 | 国产精品2| 综合国产| 免费一级特黄欧美大片勹久久网 | 加勒比在线一区 | www.色五月| 四虎永久在线免费观看 | 中国女人真人一级毛片 | 婷婷久久精品 | 美国毛片亚洲社区在线观看 | 91免费网| 四虎最新入口 | 亚洲综合图片人成综合网 | 黄网站在线观看视频 | 久久影院中文字幕 | 嫩草影院一区 | 国产岛国 | www.呦呦 | 九九99九九精彩 | 韩国美女免费网站视频 | 精品视频专区 | 久久这里只有精品免费看青草 | 欧美中文小说在线观看 | 亚洲视频www | 亚洲福利在线观看 | 国产精品福利午夜在线观看 | 国内免费视频成人精品 | 视频一区二区在线播放 | 中文字幕久久网 | 亚洲伦理一二三四 | 狠狠色婷婷丁香六月 | 欧美精品做人一级爱免费 | 91插插插网站 | 亚洲区在线播放 | 国产成人91精品 | 伊人网综合 | 91久久精一区二区三区大全 | 色综合图片 | www日本免费 | 亚洲一区亚洲二区 | 中国日韩欧美中文日韩欧美色 |