获取PHP类的命名空间动态(Get PHP class namespace dynamically)

2019-07-05 16:22发布

我怎么能自动检索类的命名空间?

神奇的VAR __NAMESPACE__是不可靠的,因为在子类中它没有正确定义。

例:

class Foo\bar\A - > __NAMESPACE__ ===富\酒吧

class Ping\pong\B extends Foo\bar\A - > __NAMESPACE__ ===富\栏(应当平\乒乓)

PS:我注意到使用相同的错误行为__CLASS__ ,但我解决了使用get_called_class() ......是有什么样get_called_class_namespace() 我怎样才能实现这样的功能?

更新:
我认为解决的办法是我自己的问题,因为我意识到get_called_class()返回完全合格的类名,因此我可以从中提取命名空间:d ...总之,如果有一个更有效的方法,让我知道了;)

Answer 1:

的命名空间class Foo\Bar\AFoo\Bar ,所以__NAMESPACE__工作得非常好。 你所寻找的可能是命名空间类名 ,你可以很容易地通过加入得到echo __NAMESPACE__ . '\\' . __CLASS__; 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), '\\'));
    }
}


Answer 2:

在PHP 5.5,::类是可用的,这使得事情更容易10X。 例如, A::class



文章来源: Get PHP class namespace dynamically