2012-11-12 48 views
7

當使用PEAR和Zend的僞命名空間格局,是很常見的遇到類heirarchies看起來像這樣:當名稱空間和類在PHP中共享名稱時會發生什麼?

Zend/ 
    Db.php 
    Db/ 
     Expr.php 

凡db.php中包含一個名爲Zend_Db和類Expr.php包含了一個名爲類Zend_Db_Expr。但是,當您嘗試將舊的5.2 psuedo命名空間轉換爲PHP 5.3命名空間時,會出現命名空間和類共享名稱的情況。由於使用操作符可以導入命名空間或類名,所以會導致含糊不清。

下面是關於轉換的應用程序,我工作的一個例子:

App/ 
    Core.php 
    Core/ 
     Autoloader.php 

這裏的基本目錄和命名空間的應用程序。在名稱空間的頂層是一個Core類:

namespace App; 
class Core { } 

核心目錄其他各種核心類,其中一些使用主Core。在僞命名空間模式下,這不是問題。但在現實的命名空間格局會創建這樣的情況:

namespace App\Core; 
use App\Core as Core; // What is this importing? Namespace or class? 

class Autoloader { 
    public function __construct(Core $core) {} 
} 

是這樣定義呢?這裏實際導入了什麼?

+0

什麼問題?我不認爲你可以導入一個命名空間。你總是導入一個類,並給它一個別名。 –

+2

http://php.net/manual/en/language.namespaces.importing.php使用可以導入一個類或命名空間。 –

回答

1

兩者兼而有之。這不是真正的導入,只是編譯器的一個暗示,在類相關操作中遇到這個別名應該擴展到這個聲明。在php命名空間只是類的一部分,所以只是想起它是這樣的

$alias = 'Zend_Db'; 
$zendDB = new $alias; 
$aliasExpr = $alias . '_Expr'; 
$expr = new $aliasExpr; 
相關問題