2012-11-12 131 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; 
相关问题