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

Ala*_*orm 102 php reflection class

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

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

/path/to/class/definition.php
Run Code Online (Sandbox Code Playgroud)

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

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

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

Gor*_*don 214

尝试

例:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();
Run Code Online (Sandbox Code Playgroud)

这将ReflectionClass在无法找到文件名时返回,例如在本机类上.


Jev*_*vin 9

对于命名空间文件中的ReflectionClass ,添加前缀"\"以使其全局如下:

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

否则,它会生成一个错误,表示未定义名称空间中的ReflectionClass. 我没有权利对上述答案发表评论,因此我将此作为补充答案.


小智 6

使用反射器,您可以构建如下函数:

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();
}
Run Code Online (Sandbox Code Playgroud)

file_by_function( 'Foo' ) 将返回定义 Foo 的文件路径,如果 Foo 是一个函数或类,则返回 false 如果无法找到该文件