当前位置: 首页 > 面试题库 >

如何在PHP项目中找到未使用的函数

公西良骏
2023-03-14
问题内容

如何在PHP项目中找到任何未使用的函数?

PHP中是否有功能或API可以让我分析代码库,例如Reflection,token_get_all()

这些API的功能是否足够丰富,以至于我不必依靠第三方工具来执行此类分析?


问题答案:

感谢Greg和Dave的反馈。并不是我想要的,但是我决定花一些时间研究它,并提出了一个快速而肮脏的解决方案:

<?php
    $functions = array();
    $path = "/path/to/my/php/project";
    define_dir($path, $functions);
    reference_dir($path, $functions);
    echo
        "<table>" .
            "<tr>" .
                "<th>Name</th>" .
                "<th>Defined</th>" .
                "<th>Referenced</th>" .
            "</tr>";
    foreach ($functions as $name => $value) {
        echo
            "<tr>" . 
                "<td>" . htmlentities($name) . "</td>" .
                "<td>" . (isset($value[0]) ? count($value[0]) : "-") . "</td>" .
                "<td>" . (isset($value[1]) ? count($value[1]) : "-") . "</td>" .
            "</tr>";
    }
    echo "</table>";
    function define_dir($path, &$functions) {
        if ($dir = opendir($path)) {
            while (($file = readdir($dir)) !== false) {
                if (substr($file, 0, 1) == ".") continue;
                if (is_dir($path . "/" . $file)) {
                    define_dir($path . "/" . $file, $functions);
                } else {
                    if (substr($file, - 4, 4) != ".php") continue;
                    define_file($path . "/" . $file, $functions);
                }
            }
        }       
    }
    function define_file($path, &$functions) {
        $tokens = token_get_all(file_get_contents($path));
        for ($i = 0; $i < count($tokens); $i++) {
            $token = $tokens[$i];
            if (is_array($token)) {
                if ($token[0] != T_FUNCTION) continue;
                $i++;
                $token = $tokens[$i];
                if ($token[0] != T_WHITESPACE) die("T_WHITESPACE");
                $i++;
                $token = $tokens[$i];
                if ($token[0] != T_STRING) die("T_STRING");
                $functions[$token[1]][0][] = array($path, $token[2]);
            }
        }
    }
    function reference_dir($path, &$functions) {
        if ($dir = opendir($path)) {
            while (($file = readdir($dir)) !== false) {
                if (substr($file, 0, 1) == ".") continue;
                if (is_dir($path . "/" . $file)) {
                    reference_dir($path . "/" . $file, $functions);
                } else {
                    if (substr($file, - 4, 4) != ".php") continue;
                    reference_file($path . "/" . $file, $functions);
                }
            }
        }       
    }
    function reference_file($path, &$functions) {
        $tokens = token_get_all(file_get_contents($path));
        for ($i = 0; $i < count($tokens); $i++) {
            $token = $tokens[$i];
            if (is_array($token)) {
                if ($token[0] != T_STRING) continue;
                if ($tokens[$i + 1] != "(") continue;
                $functions[$token[1]][1][] = array($path, $token[2]);
            }
        }
    }
?>

我可能会花更多时间,以便可以快速找到函数定义和引用的文件和行号。该信息正在收集,只是不显示。



 类似资料:
  • 问题内容: 因此,在相当庞大的项目中,您会得到一些遗留代码。您如何找到和删除无效功能? 我已经看到了这两个参考:查找未使用的代码和用于在php项目中查找未使用的函数的工具,但它们似乎分别特定于C#和PHP。 是否有Python工具可帮助您找到源代码中其他地方未引用的函数(尽管有反射/等)? 问题答案: 在Python中,您可以使用动态或静态代码分析器查找未使用的代码。动态分析器的两个示例是和。它们

  • 我有一个pycharm项目,大概还有一个Django项目。也许它们是一回事,也许不是——我不确定区别。 总之,在我的settings.py文件中(该文件位于< code>project目录的根目录下,我认为这是我的pycharm项目),我有: 这是否意味着< code>dumpstown是我的项目名称?还是我的pycharm项目名?有什么区别?因为我还有一个名为< code>dumpstownap

  • 问题内容: 你使用什么工具在大型Java项目中查找未使用/无效的代码?我们的产品已经开发了几年,并且很难手动检测不再使用的代码。但是,我们确实尝试删除尽可能多的未使用的代码。 对于一般策略/技术(除特定工具之外)的建议也将受到赞赏。 编辑:请注意,我们已经使用了代码覆盖率工具(Clover,IntelliJ),但是这些帮助不大。无效代码仍具有单元测试,并显示为已覆盖。我猜一个理想的工具可以识别出几

  • 有没有一种简单的方法来使用Java8流来实现这一点呢?例如,给定上面的数组和谓词将result设置为“2”。 如果可以获得下一个值,那么在匹配另一个谓词(如)之前,还可以获得下一个N个值或所有值的列表/数组。

  • 本文向大家介绍如何在Java eclipse项目中找到Package Explorer?,包括了如何在Java eclipse项目中找到Package Explorer?的使用技巧和注意事项,需要的朋友参考一下 要查看项目浏览器,请单击“窗口”菜单,然后单击“显示视图”并选择“项目资源管理器”。 有一种更简单的方法来打开项目资源管理器,当您在编辑器中时,按alt + shift + w并选择项目资

  • 问题内容: 因此,在我正在编写的此程序中,我实际上是使用表单从用户那里获取SQL查询。然后,我继续在数据库上运行该查询。 我知道不要“信任”用户输入,因此我想对输入进行清理。我正在尝试使用,但未能成功使用。 输入以下内容,这就是我要尝试的内容: 这总是给我 “输入无效!” 错误。 当我取出零件并仅对查询运行时, “输入无效” 不输出信息。相反,当我这样做时: 它不输出 “输入无效”。 但是,我需要