程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 5.3中的命名空間:你用過了麼?

PHP 5.3中的命名空間:你用過了麼?

編輯:關於PHP編程

【php100精選譯文】命名空間是PHP 5.3中最重要的變化,對於C#和Java開發人員對這個詞語非常熟悉了,他們終於可以更好地改變PHP應用程序的結構了。

為什麼我們需要命名空間?

隨著你的PHP代碼庫的增長,對之前定義的函數和類名進行修改時風險也更高了,當你試圖增加第三方組件或插件時問題更嚴重,如果存在兩個或兩個以上的代碼集實現了一個“Database”和“User”類會怎麼樣?

直到目前,唯一的解決辦法是使用長的類/函數名,例如Wordpress在每個類和函數名前都使用了前綴“WP_”, Zend Framework使用了極具描述性的命名約定,導致類名非常冗長,如:

Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive

命名沖突問題可以使用命名空間來解決,PHP常量、類和函數可以被組合到命名空間庫中。

如何定義命名空間?

默認情況下,所有常量、類和函數名都放在全局空間下,就和PHP支持命名空間之前一樣。

在PHP文件的頂部使用一個關鍵字namespace就可以定義命名空間,它必須是第一個命令(declare除外),在它前面不能出現非PHP代碼、HTML或空格。如:

  1. < ?php  
  2. // define this code in the 'MyProject' namespace  
  3. namespace MyProject;  
  4.  
  5. // ... code ...  

這一行下面的代碼都是指定給MyProject命名空間的,為相同代碼塊嵌套命名空間或定義多個命名空間是不可能的,如果你真這樣干,只有最後一個命名空間才能識別,但你可以在同一個文件中定義不同的命名空間代碼,如:

  1. < ?php  
  2. namespace MyProject1;  
  3. // PHP code for the MyProject1 namespace  
  4.  
  5. namespace MyProject2;  
  6. // PHP code for the MyProject2 namespace  
  7.  
  8. // Alternative syntax  
  9. namespace MyProject3 {  
  10.  // PHP code for the MyProject3 namespace  
  11. }  
  12. ?>  

盡管這麼干是可以的,但我建議你不要這麼做,最好還是每個文件中只定義一個命名空間,免得把你弄糊塗了。

子命名空間

PHP允許定義具有層次的命名空間以便庫能夠細分,子命名空間使用一個反斜線字符()分隔,如:

◆MyProjectSubName

◆MyProjectDatabaseMySQL

◆CompanyNameMyProjectLibraryCommonWidget1

調用命名空間代碼

在lib1.php文件中我們使用AppLib1 namespace命名空間定義了一個常量、一個函數和一個類,如:

lib1.php

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

現在我們可以在另一個PHP文件包括這段代碼,如:

myapp.php

  1. < ?php  
  2. header('Content-type: text/plain');  
  3. require_once('lib1.php');  
  4.  
  5. echo AppLib1MYCONST . "n";  
  6. echo AppLib1MyFunction() . "n";  
  7. echo AppLib1MyClass::WhoAmI() . "n";  
  8. ?> 

在myapp.php中並沒有定義命名空間,因此這段代碼存在全局空間中,任何對MYCONST、MyFunction和MyClass的直接引用都會失敗,因為它們存在於AppLib1命名空間中,為了調用lib1.php中的代碼,我們可以在AppLib1命名空間前添加前綴定義一個完全合格的名稱,下面是我載入myapp.php時的輸出結果:

  1. AppLib1MYCONST    
  2. AppLib1MyFunction    
  3. AppLib1MyClass::WhoAmI 

完全合格名稱可以變得很長,定義長名稱,如App-Lib1-MyClass,有一些明顯的好處。

原文:How to Use PHP Namespaces, Part 1: The Basics

作者:Craig Buckler


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved