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

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

换句话说,我有一个 PHP 类或实例化对象的名称。我想把它传递给 什么的(函数、反射类等) ,它将返回定义类的文件系统路径。

/path/to/class/definition.php

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

我还意识到我可以在我们的 _ _ autoload 机制中编写一些额外的代码来缓存这些信息。但是,在我想到的情况下,修改现有的 _ _ autoload 是禁止的。

听到有关可以做到这一点的扩展会很有趣,但我最终还是希望能够在“股票”安装上运行一些东西。

66701 次浏览

如果您有一个 include 文件夹,您可以通过执行: $filename = ``grep -r "class $className" $includesFolder/*\来运行一个 shell 脚本命令来“ grep”“ class $className”,它将返回它所在的文件。除此之外,我不认为 PHP 有什么神奇的功能可以为你做到这一点。

对于 名称空间文件中的 RefectionClass,添加一个前缀“”,使其全局化,如下所示:

反射器 = 新的反射类(‘ FOO’) ;

否则,它将在未定义的命名空间中生成一个错误,该错误称为 RefectionClass。 我没有权利对上面的答案作出评论,所以我把这个作为补充答案。

使用一个反射器,你可以建立一个像下面这样的函数:

function file_by_function( $function_name ){
if( function_exists( $function_name ) ){
$reflector = new \ReflectionFunction( $function_name );
}
elseif( class_exists( $function_name ) ){
$reflector = new \ReflectionClass( $function_name );
}
else{
return false;
}
return $reflector->getFileName();
}

File _ by _ function (‘ Foo’)将返回定义 Foo 的文件路径,如果 Foo 是一个函数或类,则返回该路径; 如果无法找到该文件,则返回 false