天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP 5.3新特性命名空間規則解析及高級功能

日前發布的php 5.3中,最重要的一個新特性就是命名空間的加入。本文介紹了php命名空間的一些術語,其解析規則,以及一些高級功能的應用,希望能夠幫助讀者在項目中真正使用命名空間。

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

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

  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. ?> 

開始之前先要理解幾個php命名空間相關術語。

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

任何php代碼都可以引用完全限定名稱,它是一個以命名空間反斜線開頭的標識符,如/App/Lib1/MYCONST,/App/Lib2/MyFunction( )等。

完全限定名稱是沒有任何歧義的,開頭的反斜線和文件路徑的作用有點類似,它表示“根”全局空間,如果我們在全局空間中實現了一個不同的MyFunction( ),可以使用/MyFunction( )從lib1.php或lib2.php調用它。

完全限定名稱對一次性函數調用或對象初始化非常有用,但當你產生了大量的調用時它們就沒有實用價值了,在下面的討論中我們將會看到,php提供了其它選項以解除我們為命名空間打字的煩惱。

◆限定名稱(Qualified name)

至少有一個命名空間分隔符的標識符,如Lib1/MyFunction( )。

◆非限定名稱(Unqualified name)

沒有命名空間分隔符的標識符,如MyFunction( )。

在相同的命名空間內工作

仔細思考下面的代碼:

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. ?>  

即使我們同時包括了lib1.php和lib2.php,MYCONST,MyFunction和MyClass標識符只能在lib1.php中引用,這是因為myapp1.php的代碼在相同的App/Lib1命名空間內。

執行結果:

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

命名空間導入

可以使用use操作符導入命名空間,如:

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. ?>
 

可以定義任意數量的use語句,或使用逗號分隔成獨立的命名空間,在這個例子中我們導入了App/Lib2命名空間,但我們仍然不能直接引用 MYCONST,MyFunction和MyClass,因為我們的代碼還在全局空間中,但如果我們添加了“Lib2/”前綴,它們就變成限定名稱 了,php將會搜索導入的命名空間,直到找到匹配項。

執行結果:

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

命名空間別名

命名空間別名可能是最有用的構想了,別名允許我們使用較短的名稱引用很長的命名空間。

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. ?>  

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

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

執行結果:

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

php命名解析規則

php標識符名稱使用下列命名空間規則進行解析,請參考php用戶手冊了解更詳細的信息:

1.在編譯時調用完全限定函數、類或常量;

2.非限定名稱和限定名稱根據導入規則進行翻譯,例如,如果A/B/C導入為C,調用C/D/e( )就會被翻譯成A/B/C/D/e( );

3.在php命名空間內,所有限定名稱尚未根據導入規則轉換,例如,如果在命名空間A/B中調用C/D/e( ),那么會被翻譯成A/B/C/D/e( );

4.非限定類名稱根據當前的導入規則進行轉換,使用全名替換導入的短名稱,例如,如果類C在命名空間A/B中被導入為X,那么new X( )就會被翻譯為new A/B/C( );

5.在命名空間中非限定函數調用在運行時解析,例如,如果MyFunction( )在命名空間A/B中被調用,php首先會查找函數/A/B/MyFunction( ),如果沒有找到,然后會在全局空間中查找/MyFunction( );

6.調用非限定或限定類名在運行時被解析,例如,如果我們在命名空間A/B中調用new C( ),php將會查找類A/B/C,如果沒有找到,php會嘗試自動載入A/B/C。


php命名空間高級特性

接下來讓我們看一看php命名空間的一些高級特性。

__NAMESPACE__常量

__NAMESPACE__是一個php字符串,它總是返回當前命名空間的名稱,在全局空間中它是一個空字符串。

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

這個值在調試時非常有用,它也可由于動態生成一個完全限定類名,如:

  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關鍵字

namespace關鍵字可以用于明確引用一個當前命名空間或子命名空間中的項目,它等價于類中的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. ?>  

自動載入命名空間類

php 5中最省時省力的特性是自動載入,在全局(非命名空間)php代碼中,可以寫一個標準自動載入函數:

  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中,你可以創建一個命名空間類的實例,在這種情況下,完全限定命名空間和類名傳遞給__autoload函數,例如,$class_name的值可 能是App/Lib1/MyClass。你可以在相同的文件夾下放置所有的php類文件,從字符串中提取命名空間,但那樣會導致文件名沖突。

另外,你的類文件層次結構會按照命名空間的結構重新組織,例如,MyClass.php文件可以創建在/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. ?>  

解釋:

1.類App/Lib1/MyClass的別名是MC;

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

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

總結

有關php命名空間的使用就介紹到這里,希望您能夠對php的命名空間有一個新的認識,并希望你能在新項目中真正使用命名空間。

php技術PHP 5.3新特性命名空間規則解析及高級功能,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 韩国无遮羞禁动漫在线观看96 | 第一次玩老妇真实经历 | 亲胸摸下面激烈免费网站 | 色偷偷888欧美精品久久久 | 国产精品免费大片一区二区 | 女人高潮被爽到呻吟在线观看 | 欧美精品99久久久啪啪 | 一本色道久久综合亚洲精品蜜桃冫 | 亚洲AV怡红院影院怡春院 | 高清国产在线观看 | 二级特黄绝大片免费视频大片 | 色吧电影院| 与嫂子同居的日子在线观看 | 精品久久久麻豆国产精品 | 伊人久久丁香色婷婷啪啪 | 日本大尺码喷液过程视频 | 新新电影理论中文字幕 | 开心片色99xxxx | 扒开老师大腿猛进AAA片邪恶 | 亚洲第一页在线播放 | 欧美精品成人a多人在线观看 | 99re.05久久热最新地址 | 成3d漫二区三区四区 | 美女脱内衣裸身尿口露出来 | 好大好硬好湿再深一点网站 | 99精品国产电影 | 狠狠爱亚洲五月婷婷av | 日本片bbbxxx | 亚洲高清在线视频 | 无码毛片内射白浆视频 | 欧美激情性AAAAA片欧美 | 日韩毛片大全 | caoporon超碰在线视频 | 高h肉肉乳共妻 | 国产成人精品自拍 | 全是肉的高h短篇列车 | 最近中文字幕高清中文字幕MV | 欧美深夜0000XXXX疯狂 | 亚洲国产成人精品久久久久 | 亚洲AV无码一区二区色情蜜芽 | 国产一区二区三区内射高清 |