查找定义了类的PHP文件(在运行时)


111

PHP中是否有任何反射/自省/魔术,可以让您找到定义了特定类(或函数)的PHP文件?

换句话说,我有一个PHP类或实例化对象的名称。我想将此传递给某个东西(函数,Reflection类等),该东西将返回定义该类的文件系统路径。

/path/to/class/definition.php

我意识到我可以使用(get_included_files())获取到目前为止已包含的所有文件的列表,然后手动解析它们,但是一次尝试就需要大量文件系统访问。

我还意识到我可以在__autoload机制中编写一些其他代码,以将该信息缓存到某个地方。但是,在我考虑到的情况下,修改现有的__autoload是不可行的。

听到可以做到这一点的扩展会很有趣,但是我最终希望可以在“常规”安装中运行的扩展。


2
Magento带我来到这里:-]
艾伦(Alan)

@alan很高兴看到那里的一些财产名称拼写。
艾伦·斯托姆

Answers:


225

尝试 ReflectionClass

例:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

false当找不到文件名时,例如在本机类上,将返回此值。


10

对于命名空间文件中的ReflectionClass ,添加前缀“ \”以使其变为全局,如下所示:

$ reflector = new \ ReflectionClass('FOO');

否则,它将在未定义的命名空间中生成一个表示ReflectionClass的错误。 我无权对以上答案发表评论,因此我将其写为补充答案。


0

如果您有一个include文件夹,则可以通过执行以下操作来运行Shell脚本命令“ class $ className”的“ grep”:$filename = ``grep -r "class $className" $includesFolder/*\它会返回它所在的文件。除此之外,我认为没有任何魔术PHP的功能可用于ya。


3
诚实,无耻的好奇心在这里。是什么让您觉得这个答案比我已经考虑并拒绝的想法更好?“我意识到我可以使用(get_included_files())获取到目前为止已包含的所有文件的列表,然后手动解析它们,但是一次尝试就需要大量文件系统访问。”
艾伦·斯托姆

我想,因为它的一行而不是用PHP写一个解析器需要多少行,而grep函数是用C编译的,而且可能比编写的要快得多。
Seaux

知道了 我真正关心的是一次又一次地重复访问每个文件的磁盘以执行此操作(这在我正在构建的工具中会发生很多事情),而不是接下来我将尝试使代码更清楚的代码量时间。(仅供参考:您应该研究ack。比grep更好!)
Alan Storm

ack还是awk?我喜欢awk,它实际上是我最喜欢的编程语言,但是越来越多的人经常使用grep ...它的“清洁器”可以使事情变得如此简单
Seaux

不是awk,不是肯定,ack:betterthangrep.com 这是针对基于搜索代码的项目进行了优化的perl back grep替换。这很棒。
艾伦·斯托姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.