4

だから私はこれらの2つのクラスを作成しました

//Quarter.php
namespace Resources;
class Quarter {
    ...
}


//Epoch.php
namespace Resources;
class Epoch {

    public static function initFromType($value, $type) {
        $class = "Quarter";
        return new $class($value, $type);
    }    
}

これは両方の非常に単純化されたバージョンですが、私の質問を説明するには十分です。ここに示されているクラスは、Quarter クラスが見つからないため機能しません。それを機能させるには、 $class 変数を次のように変更できます

$class = "\Resources\Quarter";

だから私の質問は、両方のクラスがすでに同じ名前空間のメンバーであるのに、なぜここで名前空間を使用する必要があるのですか? 名前空間は、クラス名を変数に入れるときにのみ必要です。

    public static function initFromType($value, $type) {
        return new Quarter($value, $type);
    }    

問題なく動作します。これはなぜですか?また、回避する必要がある潜在的なトラップはありますか?

4

1 に答える 1

5

ある名前空間から別の名前空間に文字列を渡すことができるためです。これにより、名前解決がせいぜいあいまいになり、奇妙な問題が発生しやすくなります。

namespace Foo;

$class = 'Baz';

namespace Bar;

new $class;  // what class will be instantiated?

特定の名前空間のリテラルには、この問題はありません。

namespace Foo;

new Baz;     // can't be moved, it's unequivocally \Foo\Baz

したがって、すべての「文字列クラス名」は常に絶対であり、FQN として記述する必要があります。

$class = 'Foo\Baz';

(注: 先頭に はありません\。)

selfこれは、クラスの自己参照に相当する略記として使用できます。

$class = __NAMESPACE__ . '\Baz';
于 2013-05-29T07:55:40.967 に答える