2013年10月22日 星期二

[php]命名空間(namespace)

為什麼我們需要命名空間?隨著你的PHP代碼庫的增長,對之前定義的函數和類名進行修改時風險也更高了,當你試圖增加第三方組件或插件時問題更嚴重,如果存在兩個或兩個以上的代碼集實現了一個“Database”和“User”類會怎麼樣?直到目前,唯一的解決辦法是使用長的類/函數名,例如Wordpress在每個類和函數名前都使用了前綴“WP_”, Zend Framework使用了極具描述性的命名約定,導致類名非常冗長,如:Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive命名衝突問題可以使用命名空間來解決,PHP常量、類和函數可以被組合到命名空間庫中。如何定義命名空間?


默認情況下,所有常量、類和函數名都放在全局空間下,就和PHP支持命名空間之前一樣。在PHP文件的頂部使用一個關鍵字namespace就可以定義命名空間,它必須是第一個命令(declare除外),在它前面不能出現非PHP代碼、HTML或空格。如:

    
< ?php
    
// define this code in the 'MyProject' namespace
    
namespace MyProject;
  
    
// ... code ...這一行下面的代碼都是指定給MyProject命名空間的,為相同代碼塊嵌套命名空間或定義多個命名空間是不可能的,如果你真這樣幹,只有最後一個命名空間才能識別,但你可以在同一個文件中定義不同的命名空間代碼,如:

    
< ?php
    
namespace MyProject1;
    
// PHP code for the MyProject1 namespace
  
    
namespace MyProject2;
    
// PHP code for the MyProject2 namespace
  
    
// Alternative syntax
    
namespace MyProject3 {
     
// PHP code for the MyProject3 namespace
    
}
    
?>儘管這麼幹是可以的,但我建議你不要這麼做,最好還是每個文件中只定義一個命名空間,免得把你弄糊塗了。子命名空間PHP允許定義具有層次的命名空間以便庫能夠細分,子命名空間使用一個反斜線字符(\)分隔,如:◆MyProject\SubName◆MyProject\Database\MySQL◆CompanyName\MyProject\Library\Common\Widget1調用命名空間代碼在lib1.php文件中我們使用App\Lib1 namespace命名空間定義了一個常量、一個函數和一個類,如:lib1.php

    
< ?php
    
// application library 1
    
namespace App\Lib1;
  
    
const MYCONST = 'App\Lib1\MYCONST';
  
    
function MyFunction() {
     
return __FUNCTION__;
    
}
  
    
class MyClass {
     
static function WhoAmI() {
      
return __METHOD__;
     
}
    
}
    
?>現在我們可以在另一個PHP文件包括這段代碼,如:myapp.php

    
< ?php
    
header('Content-type: text/plain');
    
require_once('lib1.php');
  
    
echo \App\Lib1\MYCONST . "\n";
    
echo \App\Lib1\MyFunction() . "\n";
    
echo \App\Lib1\MyClass::WhoAmI() . "\n";
    
?>在myapp.php中並沒有定義命名空間,因此這段代碼存在全局空間中,任何對MYCONST、MyFunction和MyClass的直接引用都會失敗,因為它們存在​​於App\Lib1命名空間中,為了調用lib1.php中的代碼,我們可以在\App\Lib1命名空間前添加前綴定義一個完全合格的名稱,下面是我載入myapp.php時的輸出結果:

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

原文:How to Use PHP Namespaces, Part 1: The Basics作者:Craig Buckler

沒有留言:

張貼留言

Google Analytics初學者入門簡介