7

当使用 PEAR 和 Zend 的伪命名空间模式时,通常会遇到如下所示的类层次结构:

Zend/
    Db.php
    Db/
        Expr.php

其中 DB.php 包含一个名为的类Zend_Db,而 Expr.php 包含一个名为 的类Zend_Db_Expr。但是,当您尝试将旧的 5.2 伪命名空间转换为 PHP 5.3 命名空间时,您会遇到命名空间和类共享名称的情况。由于 use 运算符可以导入命名空间或类名,这会导致歧义。

这是我正在转换的应用程序示例:

App/
    Core.php
    Core/
        Autoloader.php

这里的基本目录和命名空间是 App。在名称空间的顶层是一个Core类:

namespace App;
class Core { }

在 Core 目录中是其他各种核心类,其中一些使用 main Core. 在伪命名空间模式下,这不是问题。但在实际命名空间模式中,它会产生这种情况:

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

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

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

4

1 回答 1

1

两者兼而有之。这不是真正的导入,只是对编译器的提示,在类相关操作中每次遇到此别名都应扩展为此声明。在 php 中,命名空间只是类的一部分,所以可以这样想

$alias = 'Zend_Db';
$zendDB = new $alias;
$aliasExpr = $alias . '_Expr';
$expr = new $aliasExpr;
于 2012-11-12T18:33:47.703 回答