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\A
是Foo\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)
Ste*_*nov 11
使用反射类。
$class_name = get_class($this);
$reflection_class = new \ReflectionClass($class_name);
$namespace = $reflection_class->getNamespaceName();
Run Code Online (Sandbox Code Playgroud)