我们买了一个大的 PHP 脚本并更改了很多代码和功能。现在我们正在寻找清除一些代码,从删除未使用的函数/方法开始。
我们正在考虑使用每个方法添加几行代码debug_backtrace()
,以登录到文件或数据库,类/方法的名称+调用它的位置。
由于应用程序真的很大,在我开始编辑数百个函数之前,我想知道是否有更好的方法来做到这一点。有什么建议吗?
xdebug 的代码覆盖工具允许您测试实际执行了哪些代码行,而无需在所有函数/方法中放置跟踪语句。
没有控制代码覆盖率统计创建的 php.ini 设置。统计信息的收集由 PHP 函数在运行时打开和关闭,允许对要为其创建覆盖率统计信息的代码片段进行细粒度的控制。
要开始收集代码覆盖率统计信息,请使用xdebug_start_code_coverage()
.
要停止收集统计信息,请使用xdebug_stop_code_coverage()
.
xdebug
在脚本执行时将收集到的统计信息保存在内存中,因此您可以根据需要随时打开和关闭脚本中的代码覆盖率。要将收集的统计信息作为数组检索,请使用xdebug_get_code_coverage()
.
你在如何实现它上有很大的自由,但听起来你有一个大脚本,在这种情况下,只需从顶部启动它,停止所有退出点,并在它实际退出之前打印出覆盖范围。
Zend 开发者专区对做这些事情有很好的介绍,它从第 1 部分:介绍 xdebug开始。
如果您更喜欢进行静态分析,OWASP男孩会在他们的源代码分析工具页面上保留一份很好的工具列表以及每个工具的优缺点,其中详细介绍了开源或免费以及商业工具。
我建议检查一些,例如PHP Mess Detector (PHPMD),它与 PDepend 非常相似,并提供错误、未使用代码和过于复杂的功能的报告。它对于识别可能需要重构的点非常有用。
可以从命令行调用 PHPMD,如下所示:
phpmd {directory} {report format} {rules}
$ phpmd . text codesize,unusedcode
/src/xxxxxx/api/src/base/Model.php:75 The method __toArray() has a Cyclomatic Complexity of 12. The configured cyclomatic complexity threshold is 10.
/src/xxxxxx/api/src/controller/Users.php:235 Avoid unused parameters such as '$request'.
/src/xxxxxx/api/src/controller/Users.php:246 Avoid unused local variables such as '$x'.
/src/xxxxxx/api/src/controller/Users.php:246 Avoid unused local variables such as '$undeclared'.
/src/xxxxxx/api/src/base/Controller.php - Unexpected token: [, line: 88, col: 56, file: /src/xxxxxx/api/src/base/Controller.php.
PHP CodeSniffer可能是目前最好的工具;设置起来非常容易,默认标准很容易扩展或替换为您自己的。因此,对于多人组成的团队来说,这是一件很容易的事。它还附带 PSR-1 和 PSR-2 标准,因此维护一个开源的、与 PSR 兼容的项目只需针对您的项目安装和运行它(当然,还要遵循它的建议)。它还具有标记 JavaScript 和 CSS 的能力。
PHPCS 很容易通过以下方式从命令行调用:
phpcs --standard={comma-separated rulesets} {directory}
使用 PHPCS 的输出,在任何项目中维护样式指南都是微不足道的。来自同一项目的示例输出:
$ phpcs --standard=PSR1,PSR2 .
FILE: /src/xxxx/api/src/exception/Xxx.php
--------------------------------------------------------------------------------
FOUND 1 ERROR(S) AFFECTING 1 LINE(S)
--------------------------------------------------------------------------------
15 | ERROR | The closing brace for the class must go on the next line after | | the body
--------------------------------------------------------------------------------
Time: 0 seconds, Memory: 5.25Mb
Google 可以为您提供更多选择,而不是我们在此讨论的空间。希望这能让您走上正确的项目道路。