如何获取特定文件夹中所有类的所有方法

时间:2016-08-01 23:40:18

标签: php

我一直在阅读以下有些类似的问题:

但这些仅限于班级名称。我想知道是否有一种有效的方法(使用token_get_all()或其他方式)来检索特定文件夹中所有类中包含的所有方法?

我最初的想法是我可以使用FilesystemIterator遍历目录,然后使用ReflectionClass创建每个实例。或者我可以include每个类如果尚未声明,那么使用get_declared_classesget_class_methods的组合......但是这两个看起来都是坏主意,因为它们会消耗掉很多记忆。有更有效的方法吗?

编辑:我尝试使用token_get_all()

function getDirectoryList($dir) {
    $dirList = $fileList = [];
    $iter = new FilesystemIterator($dir, FilesystemIterator::SKIP_DOTS);

    foreach ($iter as $file) {
        if ($file->isDir()) {
            $dirList[$file->getFilename()] = getDirectoryList($file->getPathname());
        } else {
            $fileList[$file->getFilename()] = $file->getFilename();
        }
    }

    uksort($dirList, 'strnatcmp');
    natsort($fileList);
    return $dirList + $fileList;
}

$path = '/var/www/html/dev/lib/framework/controllers';
$classes = getDirectoryList($path);
foreach ($classes as $class) {
    $file = $path . '/' . $class;
    echo $file . '<br />';
    $fp = fopen($file, 'r');
    $method = $namespace = $buffer = '';
    $i = 0;
    while (!feof($fp)) {
        $buffer .= fread($fp, 512);
        $tokens = token_get_all($buffer);

        if (strpos($buffer, '{') === false) {
            continue;
        }

        for (; $i<count($tokens); $i++) {
            if ($tokens[$i][0] === T_NAMESPACE) {
                for ($j=$i+1;$j<count($tokens); $j++) {
                    if ($tokens[$j][0] === T_STRING) {
                         $namespace .= '\\'.$tokens[$j][1];
                    } else if ($tokens[$j] === '{' || $tokens[$j] === ';') {
                         break;
                    }
                }
            }

            if ($tokens[$i][0] === T_FUNCTION) {
                for ($j=$i+1;$j<count($tokens);$j++) {
                    if ($tokens[$j] === '{') {
                        $method = $tokens[$i+2][1];
                    }
                }
            }
        }
        echo '<pre>';
        var_dump($method);
        echo '</pre>';
    }
}

这给出了如下输出:

/var/www/html/dev/lib/framework/controllers/AuthController.php
string(8) "register"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(14) "registerSubmit"
string(5) "login"
string(5) "login"
string(5) "login"
string(5) "login"
string(5) "login"
string(5) "login"
string(6) "logout"
string(6) "verify"
string(6) "verify"
string(6) "verify"
string(6) "verify"
string(12) "verifySubmit"
string(12) "verifySubmit"
string(12) "verifySubmit"
string(12) "verifySubmit"
string(12) "verifySubmit"
string(12) "verifySubmit"
string(12) "verifySubmit"

重复了几种方法。此外,它似乎没有捕获所有方法,例如应列出loginSubmit。以下是整个班级的pastebin作为参考。我仍然不确定这是否是最有效的方法呢?

0 个答案:

没有答案