PHP中是否有任何反射/内省/魔术可以让你找到定义特定类(或函数)的PHP文件?
换句话说,我有一个PHP类的名称,或者一个实例化的对象。我想将此传递给某事(函数,反射类等),它将返回定义类的文件系统路径。
/path/to/class/definition.php
我意识到我可以使用(get_included_files())
获取到目前为止已包含的所有文件的列表,然后手动解析它们,但这只是单次尝试的大量文件系统访问。
我也意识到我可以在我们的__autoload机制中编写一些额外的代码来缓存这些信息。但是,在我想到的情况下,修改现有的__autoload是不受限制的。
听说可以做到这一点的扩展会很有趣,但我最终会喜欢可以在“库存”安装上运行的东西。
答案 0 :(得分:204)
尝试ReflectionClass
示例:
class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();
当找不到文件名时,这将返回false
,例如在本地课程上。
答案 1 :(得分:8)
对于命名空间文件中的ReflectionClass,添加前缀“\”以使其全局如下:
$ reflector = new \ ReflectionClass('FOO');
否则,它会生成一个错误,表示未定义名称空间中的ReflectionClass。 我无权对上述答案发表评论,因此我将此作为补充答案。
答案 2 :(得分:1)
使用反射器可以构建这样的函数:
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
答案 3 :(得分:0)
如果你有一个包含文件夹,你可以通过执行:$filename = ``grep -r "class $className" $includesFolder/*\
运行一个shell脚本命令来“grep”为“class $ className”,它会返回它所在的文件。除此之外,我不要认为PHP有任何神奇的功能来为你做。