13

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

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

4

3 回答 3

17

class Foo\Bar\Ais的命名空间Foo\Bar,所以__NAMESPACE__运行得很好。您正在寻找的可能是命名空间的类名,您可以通过 join 轻松获得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 回答
3

使用反射类

$class_name = get_class($this);

$reflection_class = new \ReflectionClass($class_name);

$namespace = $reflection_class->getNamespaceName();
于 2021-05-25T23:35:48.957 回答