【问题标题】:Get PHP class namespace dynamically动态获取 PHP 类命名空间
【发布时间】:2012-12-05 14:51:22
【问题描述】:

如何自动检索类命名空间?

魔术 var __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 ...无论如何,如果有更有效的方法,请告诉我;)

【问题讨论】:

标签: php oop introspection


【解决方案1】:

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), '\\'));
    }
}

【讨论】:

  • 他们在父类中使用 __NAMESPACE__,但他们想要子类的命名空间。
  • @MaximilianRuta 好吧,感谢您的编辑,但请在以后只更正需要更正的内容。所有出现的 You 都更改为 you?这是我的写作风格,为了表现出一些礼貌,所以如果你不介意,让我保持我表达自己的风格。谢谢!还要感谢审阅者批准了这样的次要而不是太多正确的编辑请求...干得好!
  • 问题是我必须为编辑请求更改至少 n 个字符。这就是为什么我不得不更改您帖子中的其他内容的原因。
  • 你为什么这样写?
【解决方案2】:

在 PHP 5.5 中,::class 可用,这使事情变得简单了 10 倍。例如。 A::class

【讨论】:

【解决方案3】:

使用Reflection class

$class_name = get_class($this);

$reflection_class = new \ReflectionClass($class_name);

$namespace = $reflection_class->getNamespaceName();

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2011-05-29
    • 2011-08-08
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多