不太确定最好的标题,但我会尽我所能解释我所要求的。假设我有以下文件:
MyCustomClass.php
<?php
namespace MyNamespace;
use FooNamespace\FooClass;
use BarNamespace\BarClass as Bar;
use BazNamespace\BazClass as BazSpecial;
class MyCustomClass {
protected $someDependencies = [];
public function __construct(FooClass $foo, Bar $bar) {
$someDependencies[] = $foo;
$someDependencies[] = $bar;
}
}
现在,如果我使用反射,我可以从构造中的类型提示中获得完全限定的类名。
但是,我会收到FooNamespace\FooClass
和BarNamespace\BarClass
。不是,FooNamespace\FooClass
和BarNamespace\Bar
。我也不会得到BazNamespace\BazClass
的引用。
基本上我的问题是如何从MyCustomClass.php
中获取完全限定名称,同时只知道FooClass
、Bar
和BazSpecial
?
我不想使用文件解析器,因为这会降低性能。我希望能够做到这样的事情:
$class = new ReflectionClass('MyCustomClass');
...
$class->getUsedClass('FooClass'); // FooNamespace\FooClass
$class->getUsedClass('Bar'); // BarNamespace\BarClass
$class->getUsedClass('BazSpecial'); // BazNamespace\BazClass
我该怎么做呢?
4条答案
按热度按时间enxuqcxy1#
既然没有人回答,我想没有一个简单的方法来实现这一点。因此,我创建了自己的类
ExtendedReflectionClass
,它实现了我所需要的。我已经创建了一个要点与类文件和自述文件,这是在底部,所以得到滚动!.
ExtendedReflectionClass
用法示例:
mwg9r5ms2#
我使用TokenFinderTool。
基本上,它使用标记来提取use语句。
据我所知,\反射对象在php不幸的是没有这样的方法。
下面的代码使用TokenFinder工具从文件中提取use import语句。
将输出:
注意:如果你只有一个类名,你可以使用这个代码段:
uajslkp63#
使用BetterReflection(composer req roave/better-reflection)
vwoqyblh4#
这是我对类似任务的解决方案。这个解决方案没有考虑as选项,因为我不需要它。但很短,可能有用。