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

时间:2010-03-10 19:55:01

标签: php reflection class

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

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

/path/to/class/definition.php

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

我也意识到我可以在我们的__autoload机制中编写一些额外的代码来缓存这些信息。但是,在我想到的情况下,修改现有的__autoload是不受限制的。

听说可以做到这一点的扩展会很有趣,但我最终会喜欢可以在“库存”安装上运行的东西。

4 个答案:

答案 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有​​任何神奇的功能来为你做。