动态获取PHP类命名空间

时间:2012-12-18 11:47:30

标签: php oop introspection

如何自动检索类命名空间?

魔术变量__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 ......无论如何,如果有更有效的方法让我知道;)

3 个答案:

答案 0 :(得分:11)

class Foo\Bar\A的命名空间为Foo\Bar,因此__NAMESPACE__效果非常好。您正在寻找的可能是 namespaced classname ,您可以通过加入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), '\\'));
    }
}

答案 1 :(得分:9)

在PHP 5.5中,:: class可用,这使得10X更容易。例如。 A::class

答案 2 :(得分:0)

使用Reflection class

$class_name = get_class($this);

$reflection_class = new \ReflectionClass($class_name);

$namespace = $reflection_class->getNamespaceName();