【问题标题】:Get fully qualified class name from unqualified class name从非限定类名中获取完全限定类名
【发布时间】:2021-03-25 05:15:03
【问题描述】:

我怎样才能做到这一点?

<?php
namespace Target {
  
  class FooBar {
  
  }
}

namespace Test {
  
  use Target\FooBar;

  $class = 'FooBar';

  var_dump(new \ReflectionClass(new $class));

}

目前它失败了,因为反射类只能找到具有完整命名空间的类。我怎样才能改变它,以便它从使用语句中提取类?如果有我缺少的功能。尝试$class::class 之类的东西也会出错。

我的全部目的是能够使用这样的数组注释:

<?php
namespace Target {
  use Foo\Bar;
  
  class FooBar {
    /**
     * @var Bar[]|null
     */
    public ?array $foo;
  }
}

也许我正在做的事情是不可能的,我应该只在注释中使用完全限定的类名。

我正在使用 PHP7.4

【问题讨论】:

  • $class = FooBar::class 应该与new \ReflectionClass(new $class) 配对使用。还是我误解了这个问题?
  • use 语句是语法快捷方式。在编译的代码中它们不存在并且类名是完全限定的。

标签: php namespaces


【解决方案1】:

恐怕这是不可能的。根据PHP documentation,动态类名中应使用完全限定的类名。

必须使用完全限定名(带有命名空间前缀的类名)。请注意,由于动态类名、函数名或常量名中的限定名和完全限定名没有区别,因此不需要前导反斜杠。

<?php

namespace Target {
    class FooBar
    {
    }
}

namespace Test {
    $class = 'Target\FooBar';

    var_dump(new \ReflectionClass(new $class));
}

作为替代方案,有一个选项可以解析 use 语句并从那里获取完全限定的类名,但这种方式有点 hacky。 github.com/Kdyby/ParseUseStatements

【讨论】:

  • 我发现这是可能的,但只能通过使用更多代码来解析原始文件的使用语句,就像这个库一样 github.com/Kdyby/ParseUseStatements
  • 哦,显然有可能,是的。但这是一种非常非常hacky的方式。当然,如果无法避免,这是一种选择。感谢您的更新。
猜你喜欢
  • 2014-06-04
  • 1970-01-01
  • 2021-11-30
  • 2013-11-21
  • 2020-11-12
  • 1970-01-01
  • 2015-08-03
  • 2011-11-08
  • 2016-09-30
相关资源
最近更新 更多