我怎么能自动检索类的命名空间?
神奇的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 ...总之,如果有一个更有效的方法,让我知道了;)
的命名空间class Foo\Bar\A
是Foo\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), '\\'));
}
}
在PHP 5.5,::类是可用的,这使得事情更容易10X。 例如, A::class