13

クラスの名前空間を自動的に取得するにはどうすればよいですか?

__NAMESPACE__サブクラスでは正しく定義されていないため、magic varは信頼できません。

例:

class Foo\bar\A-> __NAMESPACE__=== Foo\bar

class Ping\pong\B extends Foo\bar\A-> __NAMESPACE__=== Foo\bar (ピン\ポンのはずです)

ps: を使用して同じ間違った動作に気付きましたが、使用し__CLASS__て解決しましたget_called_class()... のようなものはありますget_called_class_namespace()か? どうすればそのような機能を実装できますか?

更新:完全修飾クラス名を返す
ことに気付いたので、解決策は私自身の質問にあると思います。get_called_class()したがって、そこから名前空間を抽出できます:D ...とにかく、より効果的なアプローチがあれば教えてください;)

4

3 に答える 3

17

の名前空間class Foo\Bar\AFoo\Barであるため、__NAMESPACE__は非常にうまく機能しています。あなたが探しているのは、おそらく名前空間化されたクラス名であり、参加することで簡単に取得できますecho __NAMESPACE__ . '\\' . __CLASS__;

次の例を考えてみましょう:

namespace Foo\Bar\FooBar;

use Ping\Pong\HongKong;

class A extends HongKong\B {

    function __construct() {
        echo __NAMESPACE__;
    }
}

new A;

Foo\Bar\FooBar非常に正しい印刷されます...

そして、あなたがそうしても

namespace Ping\Pong\HongKong;

use Foo\Bar\FooBar;

class B extends FooBar\A {

    function __construct() {
        new A;
    }
}

エコーしますがFoo\Bar\FooBar、これも非常に正しいです...

編集:ネストされているメイン内のネストされたクラスの名前空間を取得する必要がある場合は、次を使用します。

namespace Ping\Pong\HongKong;

use Foo\Bar\FooBar;

class B extends FooBar\A {

    function __construct() {
        $a = new A;
        echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\'));
    }
}
于 2012-12-18T12:04:47.620 に答える
12

PHP 5.5 では ::class が利用可能になり、10 倍簡単になります。例えば A::class

于 2015-04-30T13:00:53.343 に答える