动态获取PHP类命名空间

dav*_*ode 12 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 ...无论如何,如果有更有效的方法让我知道;)

sha*_*yyx 13

命名空间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;
Run Code Online (Sandbox Code Playgroud)

将打印出来的Foo\Bar\FooBar是非常正确的......

即使你这样做了

namespace Ping\Pong\HongKong;

use Foo\Bar\FooBar;

class B extends FooBar\A {

    function __construct() {
        new A;
    }
}
Run Code Online (Sandbox Code Playgroud)

它会回声Foo\Bar\FooBar,这又是非常正确的......

编辑:如果您需要在嵌套它的main中获取嵌套类的命名空间,只需使用:

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), '\\'));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 他们在父类中使用\ _ _ _ NAMESPACE\_ _ _,但他们想要子类的命名空间. (3认同)
  • 你为什么这样写? (3认同)

Dav*_*Lin 12

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


Ste*_*nov 11

使用反射类

$class_name = get_class($this);

$reflection_class = new \ReflectionClass($class_name);

$namespace = $reflection_class->getNamespaceName();
Run Code Online (Sandbox Code Playgroud)