当使用PEAR和Zend的伪命名空间模式时,通常会遇到如下所示的类heirarchies:
Zend/
Db.php
Db/
Expr.php
其中DB.php包含名为Zend_Db
的类,Expr.php包含名为Zend_Db_Expr
的类。但是,当您尝试将旧的5.2 psuedo命名空间转换为PHP 5.3命名空间时,会出现一个命名空间和类共享名称的情况。由于use运算符可以导入命名空间或类名,因此会导致歧义。
以下是我正在进行转换的应用示例:
App/
Core.php
Core/
Autoloader.php
这里基本目录和命名空间是App。在名称空间的顶层是Core
类:
namespace App;
class Core { }
在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 :(得分:1)
两者都是。这不是真正的重要,只是编译器的一个提示,这个别名在类相关操作中的每次遇到都应该扩展到这个声明。在php中,命名空间只是类的一部分,所以只需将其想象一下
$alias = 'Zend_Db';
$zendDB = new $alias;
$aliasExpr = $alias . '_Expr';
$expr = new $aliasExpr;