[初級] PHP 5.3中的命名空間:你用過了麼?

爲何咱們須要命名空間?

    隨着你的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文件包括這段代碼,如: 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

    徹底合格名稱能夠變得很長,定義長名稱,如App-Lib1-MyClass,有一些明顯的好處。
相關文章
相關標籤/搜索