国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

PHP命名空間規則解析及高級功能

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

【51CTO精選譯文】在第一部分中我們介紹了PHP命名空間的用途和namespace關鍵字,在這篇文章中我們將介紹一下use命令的使用以及PHP如何解析命名空間的名字的。

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

lib1.php

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

lib2.php

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

開始之前先要理解幾個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

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

可以定義任意數量的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.  
  5. header('Content-type: text/plain');  
  6. require_once('lib1.php');  
  7. require_once('lib2.php');  
  8.  
  9. echo L\MYCONST . "\n";  
  10. echo L\MyFunction() . "\n";  
  11. echo L\MyClass::WhoAmI() . "\n";  
  12. echo Obj::WhoAmI() . "\n";  
  13. ?>  

第一個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。

#p#

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的命名空間有一個新的認識,并希望你能在新項目中真正使用命名空間。

原文:How to Use PHP Namespaces

作者:Craig Buckler

【編輯推薦】

  1. PHP 5.3中的命名空間:你用過了么?
  2. PHP 5.3中的命名空間使用方法淺述
  3. PHP 5.3.0發布 新增命名空間等多項特性
  4. PHP的命名空間
  5. PHP 5.3閉包語法初探
責任編輯:yangsai 來源: 51CTO.com
相關推薦

2009-11-18 16:58:55

PHP命名規則

2010-07-05 16:33:00

PHPPHP命名空間

2010-08-06 10:41:59

Flex命名空間

2009-09-21 08:50:42

.NET中文變量

2011-03-16 14:23:38

分布式文件

2009-07-20 10:18:49

PHP 5.3命名空間

2009-07-01 09:32:11

PHP 5.3.0

2010-01-12 17:32:49

H3C交換機命名規則

2010-09-01 13:44:23

idclassCSS

2009-07-17 09:31:06

PHP 5.3命名空間

2010-08-25 09:11:57

DIVCSS

2012-08-24 09:05:30

IBMdW

2010-09-07 15:53:02

CSS規范化

2010-09-08 16:49:05

CSSclassid

2010-08-30 10:46:13

DIV+CSS

2013-08-21 16:48:42

.Net命名空間

2009-08-27 15:34:38

C#命名空間

2009-08-28 13:56:25

C#反射命名空間

2009-08-12 10:46:54

C#命名空間

2009-09-11 09:22:14

System.Linq
點贊
收藏

51CTO技術棧公眾號

国产一区免费| 久久精品日产第一区二区三区乱码 | 狠狠网亚洲精品| 亚洲在线一区二区| 99国内精品久久久久久久| 国产成人精品国内自产拍免费看| 未满十八勿进黄网站一区不卡| 日韩一级大片在线| jizz性欧美10| 欧美va在线播放| 丁香花在线观看完整版电影| 亚洲精品suv精品一区二区| 超碰公开在线| 亚洲国产免费av| 欧美精品总汇| 免费97视频在线精品国自产拍| 国产精品视频一区视频二区| 欧美精品在线网站| 亚洲欧洲国产精品一区| 久久久久久久久久国产| 美女呻吟一区| 国产免费一区二区三区在线能观看| 国产伦精品一区二区三区千人斩| 日本精品一区二区三区在线| 91视频综合| 欧美一区二区高清在线观看| 激情综合网天天干| www日韩在线观看| 亚洲一区二区五区| 97在线观看免费观看高清| 精品国产一区久久| 国产精品视频一区二区三区| 欧美重口另类videos人妖| 一区二区三区毛片免费| 麻豆蜜桃91| 国产很黄免费观看久久| 国产高潮免费视频| 精品国产福利在线| 51xtv成人影院| 久久精品亚洲94久久精品| 怕怕欧美视频免费大全| 久久久久久久免费| www.色精品| 在线免费色视频| 亚洲大胆人体视频| 国产精品sss在线观看av| 亚洲精品免费av| 国产主播一区二区| 高清hd写真福利在线播放| 欧美精品粉嫩高潮一区二区| 国产成人免费精品| 国产精品99久久99久久久二8| 亚洲成人在线| 精品少妇一区二区三区在线| 狠狠躁夜夜躁人人爽天天天天97 | 欧美日本一区二区三区| 亚洲欧洲日本韩国| 欧美亚洲国产另类| 在线一区免费观看| 国产美女三级视频| 欧美少妇一区二区| 只有精品亚洲| 成人免费高清完整版在线观看| 日韩综合在线视频| 色播五月综合网| 欧美一卡2卡三卡4卡5免费| 欧美成年网站| 欧美成熟毛茸茸复古| av欧美精品.com| 国模吧精品人体gogo| 久久夜色精品国产亚洲aⅴ| 伊人久久大香线蕉综合热线| 日本在线观看a| 91麻豆精品久久久久蜜臀| 精品自拍偷拍| 五月天在线免费视频| 性感美女久久精品| 91国内外精品自在线播放| 国产91社区| 成人免费在线视频观看| 松下纱荣子在线观看| 亚洲影影院av| 最新国产精品久久精品| 欧洲成人一区| 天堂av一区二区| 色综合亚洲欧洲| 久久a级毛片毛片免费观看| 热久久最新网址| 欧美精品v国产精品v日韩精品| 欧美自拍视频| 日韩少妇内射免费播放| 精品国产免费一区二区三区香蕉| 97偷自拍亚洲综合二区| 少妇黄色一级片| 日韩精品视频在线观看免费| 欧美日韩影院| 福利在线国产| 午夜精品一区二区三区视频免费看| 男男成人高潮片免费网站| 黄污在线观看| 2018日韩中文字幕| 26uuuu精品一区二区| 日韩在线伦理| 婷婷精品国产一区二区三区日韩| 色哟哟日韩精品| 成人在线丰满少妇av| 99热免费在线| 欧美高清视频在线播放| 大桥未久av一区二区三区中文| 欧美一卡二卡| 欧美高清性xxxxhdvideosex| 色综合久久久久久久久久久| 精品国产乱码久久久| 天堂在线资源视频| 九色porny丨入口在线| 国产成人精品免高潮在线观看| 老鸭窝毛片一区二区三区| 1769国产精品| 亚洲精品中文在线影院| avav在线看| 亚洲欧洲av色图| 日本xxxxx18| 欧美成人女星排名| 精品电影一区| 伪装者免费全集在线观看| 午夜欧美不卡精品aaaaa| 久久久久久久综合色一本| 欧美日一区二区三区| 一区二区三区我不卡| 欧美精品一区二区三区很污很色的| 国产亚洲精品自拍| 麻豆传媒在线免费| 久久久久久一区| 日韩欧美视频在线| 蜜臀av性久久久久蜜臀av麻豆| 视频在线这里都是精品| 天天好比中文综合网| 精品国产欧美一区二区| 免费观看30秒视频久久| heyzo高清国产精品| 日韩久久精品一区二区三区| 日韩一级片在线播放| 久久大逼视频| 污片在线免费观看| 亚洲免费av网| 在线亚洲国产精品网| 成人免费视频caoporn| 精品视频一区二区三区在线观看| wwwxxx黄色片| 国产精品久久不能| 日本乱人伦一区| 丝袜美腿亚洲色图| 成人做爰视频www网站小优视频| 日韩精品在线观看av| 欧美黑人性生活视频| 亚洲精品一二三| 中文字幕亚洲综合久久五月天色无吗''| 久久电影视频| 欧美一区二区福利| 一区二区三区亚洲| 18成人在线观看| 自由日本语亚洲人高潮| 四虎亚洲精品| 91免费视频网站在线观看| 欧美亚洲成人网| 欧美日韩久久一区| 成人免费视频一区二区| 国产一区二区在线| 91麻豆一二三四在线| www.爱色av.com| 91精品啪在线观看麻豆免费| 精品久久久久久久人人人人传媒| 99re亚洲国产精品| 日韩精品dvd| 深夜在线视频| 黄网站免费观看| 亚洲免费精品视频| 久久久久久美女| 欧美精品一二三区| 日本一区二区三区国色天香 | 黄色激情在线视频| 国产成人亚洲精品| 日韩一区二区免费电影| 久久久久久一二三区| 国产精品av久久久久久麻豆网| 欧美一区 二区 三区| 中文字幕视频在线免费| 8x8x华人在线| 亚洲一区二区免费| 亚洲女人天堂网| 午夜精品国产更新| k8久久久一区二区三区| 国内久久精品| 国产日韩三级| 91www在线| 依依成人在线| 一本久道综合色婷婷五月| 久久精品五月婷婷| 91国产精品91| 日韩精品在线免费观看视频|