当命名空间和类在PHP中共享名称时会发生什么?

时间:2012-11-12 17:54:26

标签: php namespaces

当使用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) {}
}

这是定义的吗?这里实际导入了什么?

1 个答案:

答案 0 :(得分:1)

两者都是。这不是真正的重要,只是编译器的一个提示,这个别名在类相关操作中的每次遇到都应该扩展到这个声明。在php中,命名空间只是类的一部分,所以只需将其想象一下

$alias = 'Zend_Db';
$zendDB = new $alias;
$aliasExpr = $alias . '_Expr';
$expr = new $aliasExpr;