动态获取PHP类名称空间
如何自动检索类名称空间 magic var动态获取PHP类名称空间,php,oop,introspection,Php,Oop,Introspection,如何自动检索类名称空间 magic var\uuuu名称空间\uuuu不可靠,因为在子类中它没有正确定义 例如: 类Foo\bar\A->\uuu名称空间\uuu==Foo\bar class Ping\pong\B扩展了Foo\bar\A->\uu名称空间==Foo\bar(应该是Ping\pong) ps:我注意到使用\uuuu CLASS\uuuu时出现了相同的错误行为,但我使用get\u called\u CLASS()解决了这个问题。。。是否有类似于get\u的东西被称为\u clas
\uuuu名称空间\uuuu
不可靠,因为在子类中它没有正确定义
例如:
类Foo\bar\A
->\uuu名称空间\uuu
==Foo\bar
class Ping\pong\B扩展了Foo\bar\A
->\uu名称空间
==Foo\bar(应该是Ping\pong)
ps:我注意到使用\uuuu CLASS\uuuu
时出现了相同的错误行为,但我使用get\u called\u CLASS()
解决了这个问题。。。是否有类似于get\u的东西被称为\u class\u namespace()
?如何实现这样的功能
更新:我认为解决方案在我自己的问题中,因为我意识到
get\u called\u class()
返回完全限定的类名,因此我可以从中提取名称空间:D
…无论如何,如果有更有效的方法,请告诉我;) 类Foo\Bar\A的命名空间是
Foo\Bar
,因此\uuuu命名空间
运行良好。您所寻找的可能是名称空间的类名,您可以通过加入echo\uuuuu NAMESPACE\uuuu.'\\'轻松获得__第二类代码>
考虑下一个例子:
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
,这同样是非常正确的
编辑:如果需要在嵌套嵌套嵌套类的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), '\\'));
}
}
在PHP5.5中,::类是可用的,这使事情变得更加容易。例如。
A::类
使用
你的解决方案是我在个人代码中必须做的。你所描述的不是错误的行为。看看这些常数携带了什么:-当你找到问题的解决方案时,你可以回答你自己的问题。看看这个。我想这就是你的意思:我想这就是你想要的:他们在父类中使用_NAMESPACE _uu,但他们想要子类的名称空间。@MaximilianRuta好吧,谢谢你的编辑,但请以后只更正需要更正的内容。你的所有事件都变成了你?这是我的写作风格,也是为了表示礼貌,所以如果你不介意的话,让我保留我表达自己的风格。谢谢还要感谢审稿人批准了这样一个次要的、不太正确的编辑请求。。。做得好!问题是我必须为编辑请求更改至少n个字符。这就是为什么我不得不在你的帖子中修改其他内容的原因。你为什么要这样写?对于动态类的示例或get_class()
。
$class_name = get_class($this);
$reflection_class = new \ReflectionClass($class_name);
$namespace = $reflection_class->getNamespaceName();