获取文件中定义的函数和类?

时间:2011-10-03 22:20:07

标签: php reflection

我正在遍历目录中的所有文件。现在我想获得每个函数和类中定义的所有函数和类。从那里,我可以使用ReflectionClass进一步检查它们。我无法弄清楚如何获取文件中定义的所有函数和类。

ReflectionExtension看起来最接近我想要的,除了我的文件不属于扩展名。是否有一些我忽略的课程或功能?

2 个答案:

答案 0 :(得分:2)

好问题。 get_declared_classesget_defined_functions可能是一个很好的起点。在尝试确定给定文件中的内容时,您必须记下已定义的类/函数。

此外,不确定您的最终目标是什么,但PHP DependPHP Mess Detector等工具可能会执行与您想要的相似的操作。我也建议你查看它们。

答案 1 :(得分:0)

这是我能想到的最好的(courtesy):

function trimds($s) {
    return rtrim($s,DIRECTORY_SEPARATOR);
}

function joinpaths() {
    return implode(DIRECTORY_SEPARATOR, array_map('trimds', func_get_args()));
}

$project_dir = '/path/to/project/';

$ds = array($project_dir);

$classes = array();

while(!empty($ds)) {
    $dir = array_pop($ds);
    if(($dh=opendir($dir))!==false) {
        while(($file=readdir($dh))!==false) {
            if($file[0]==='.') continue;
            $path = joinpaths($dir,$file);
            if(is_dir($path)) {
                $ds[] = $path;
            } else {
                $contents = file_get_contents($path);
                $tokens = token_get_all($contents);
                for($i=0; $i<count($tokens); ++$i) {
                    if(is_array($tokens[$i]) && $tokens[$i][0] === T_CLASS) {
                        $i += 2;
                        $classes[] = $tokens[$i][1];
                    }
                }
            }
        }
    } else {
        echo "ERROR: Could not open directory '$dir'\n";
    }
}

print_r($classes);

希望我没有必要解析文件并循环遍历这样的所有令牌。


忘了以前的解决方案阻止我按照自己的意愿使用反射。新解决方案:

$project_dir = '/path/to/project/';

$ds = array($project_dir);

while(!empty($ds)) {
    $dir = array_pop($ds);
    if(($dh=opendir($dir))!==false) {
        while(($file=readdir($dh))!==false) {
            if($file[0]==='.') continue;
            $path = joinpaths($dir,$file);
            if(is_dir($path)) {
                $ds[] = $path;
            } else {
                try{
                    include_once $path;
                }catch(Exception $e) {
                    echo 'EXCEPTION: '.$e->getMessage().PHP_EOL;
                }
            }
        }
    } else {
        echo "ERROR: Could not open directory '$dir'\n";
    }
}

foreach(get_declared_classes() as $c) {
    $class = new ReflectionClass($c);
    $methods = $class->getMethods();
    foreach($methods as $m) {
        $dc = $m->getDocComment();
        if($dc !== false) {
            echo $class->getName().'::'.$m->getName().PHP_EOL;
            echo $dc.PHP_EOL;
        }
    }
}