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 に答える