web-dev-qa-db-ja.com

PHPクラスの名前空間を動的に取得する

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

マジック変数___NAMESPACE___は、サブクラスで正しく定義されていないため、信頼できません。

例:

_class Foo\bar\A_-> ___NAMESPACE___ === Foo\bar

_class Ping\pong\B extends Foo\bar\A_-> ___NAMESPACE___ === Foo\bar(Ping\pongである必要があります)

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

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

12
daveoncode

class Foo\Bar\Aの名前空間はFoo\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をエコーし​​ますが、これも非常に正しいです。

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

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), '\\'));
    }
}
12
shadyyx

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

10
David Lin