Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态获取PHP类名称空间_Php_Oop_Introspection - Fatal编程技术网

动态获取PHP类名称空间

动态获取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

如何自动检索类名称空间

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 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();