如何自动检索类命名空间?
魔术变量__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
......无论如何,如果有更有效的方法让我知道;)
答案 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)
$class_name = get_class($this);
$reflection_class = new \ReflectionClass($class_name);
$namespace = $reflection_class->getNamespaceName();