检查和改进代码的PHP代码质量工具

  • A+
所属分类:php工具

它们由您的同事开发人员Dave编写。

这些类充满了格式错误,较差的缩进和奇怪的单字母变量。有很多依赖项需要向下滚动几分钟才能逃脱膨胀的构造函数。

Shacking,你打开单元测试以了解它应该如何工作......但它们不存在。恐怖和不幸!

你可以让Dave来到你的办公桌前,对他大喊大叫,你从未见过如此蹩脚的代码,诅咒他和他的家人。

但是,既然你是一个尊敬的人,你知道这不是一个好的解决方案。教学而不是责备总能带来更好的结果。

有了一个禅宗僧人的平静,你首先修复了在戴夫的帮助下驾驶你的老板疯狂的错误。然后,您决定向您的团队介绍一些代码质量工具。

亲爱的读者,您已经拥有了良好的方法:代码质量工具对于编写可靠且无错误的PHP代码至关重要。它可以帮助您的同事检测代码库中的缺陷并向他们传授一些关键概念。

但是,不要忘记它们提供的建议和数据并不适用于所有地方。您的经验和分析技能是您首先应该信任的。

如果您已经对本文感到厌倦并且只想查看一个简单的PHP工具列表,则可以直接跳转到 引用列表 。

在潜入之前的最后一件事:本文中介绍的工具分析或格式化您的代码,我不会谈论测试。

安装代码质量工具

安装此处描述的工具总是有多种方法。

我个人的偏好是使用 cgr 来使用composer的全局包安装来避免全局范围的依赖性问题。

在大多数情况下,您也可以使用 PHAR 格式。

您可以参考每个工具的文档,以获得安装它们的所有可能方法。

如何使用这些工具

在你的终端

所有工具都可以在终端中使用。大多数情况下,您只需将代码库的路径作为参数传递即可!我将为本文中的每个工具描述此过程。

我建议你从项目的主文件夹中调用这些工具。每个示例都假设您的代码库位于该文件夹中 src

在Vim / Neovim

您可以在Vim中轻松配置所需的每个工具,并让它们解析打开的文件。

使用插件 neomake, 您可以轻松地将 PHPMD , PHPSTAN 和 PHPCS插入 Vim。它将显示在阴沟警告和错误中。非常便利!

您甚至可以创建自己的制造商来使用您想要的每个PHP代码质量工具。作为参考,您可以参考我的 neomake配置文件 。

在PHPStorm中

由于 我不再使用PhpStorm ,我不会解释如何在IDE中安装这些工具。

不过,这里有一些手册链接到Jetbrain的文档:

  • PHPMD
  • PHPCS

PHP质量工具:必不可少的

没有以下插件我不会写任何代码行。他们会正确格式化您的代码,并为您提供宝贵的建议。

PHP-CS-Fixer(PHP编码标准修复程序)

  • Github上
  • 文档

让我们从长期会议,仇恨行为和谋杀冲动的原因开始:代码格式规则。 帕金森琐碎定律的 一个很好的例子。

我个人对代码格式没有任何偏好。我关心的是拥有 一致的 :

  • 它更容易阅读
  • 它让你的思想更加重要

PHP-CS-fixer是一个简单的工具,允许您自动格式化代码。默认情况下,使用 PSR-1 和 PSR-2规则,但您可以定义自己的格式规则。

使用以下命令,您可以格式化整个代码库:

$ php-cs-fixer fix src/

您也可以在不应用它们的情况下预览修改( --diff 选项),或者您可以精确 --rules 选择要使用的规则(选项)。

PHPCS(PHP CodeSniffer)

  • Github上
  • 文档

PHP CodeSniffer是一个非常好的工具,用于输出代码库中的编码标准违规。可以使用两个命令行脚本: phpcs 输出实际的编码标准缺陷和 phpcbf ,它可以为您修复一些错误。

您可以输入例如:

$ phpcs src/

输出看起来像这样:

FILE: /home/superCoolUser/mySuperProject/src/Model/SuperModel.php
------------------------------------------------------------------------------------------
FOUND 6 ERRORS AND 1 WARNINGS AFFECTING 7 LINES
------------------------------------------------------------------------------------------
  2 | ERROR   | [ ] Missing file doc comment
 14 | ERROR   | [ ] Missing @category tag in class comment
 20 | ERROR   | [ ] Missing doc comment for function __construct()
 34 | WARNING | [ ] Line exceeds 85 characters; contains 93 characters
 57 | ERROR   | [x] Opening parenthesis of a multi-line function call must be the last content on the line
 60 | ERROR   | [ ] Expected "if (...) {\n"; found "if(...) {\n"
 63 | ERROR   | [x] Closing parenthesis of a multi-line function call must be on a line by itself
----------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------------

正如您所看到的,phpcbf可以通过键入以下内容自动修复两个错误:

$ phpcbf src/Model/SuperModel.php

您可以使用PHP Code Sniffer附带的默认编码标准,也可以 轻松实现自己的 编码标准。

PHPMD(PHP Mess Detector)

  • 官方网站
  • 文档

PHPMD将在您的应用程序中显示该语言可能存在的错误和误用。

这里怎么做的魔术:

$ phpmd src/ text cleancode

PHPMD将扫描项目的目录和子目录,并以纯文本形式输出发现的错误。您也可以通过替换上面命令行中的选项来创建 html 或 xml 输出 text 。

在此示例中,我们使用 cleancode 规则集,但您显然可以更改它或创建自己的规则集。

您想要在文件中输出错误吗?简单:

$ phpmd src/ html cleancode --reportfile ~/phpmd.html

如果选择 xml 输出,您将获得有关规则集的更多信息,如下所示:

<file name="/home/mySuperUser/mySuperProject/src/randomClass.php">
    <violation beginline="61" endline="61" rule="BooleanArgumentFlag" ruleset="Clean Code Rules" externalInfoUrl="http://phpmd.org/rules/cleancode.html#booleanargumentflag" priority="1">
      The method notThatCoolMethod has a boolean flag argument $badBoolean, which is a certain sign of a Single Responsibility Principle violation.
    </violation>
    <violation beginline="102" endline="104" rule="ElseExpression" ruleset="Clean Code Rules" externalInfoUrl="http://phpmd.org/rules/cleancode.html#elseexpression" priority="1">
      The method superMethod uses an else expression. Else is never necessary and you can simplify the code to work without else.
    </violation>
  </file>

您可以看到例如违反规则的优先级。然后,您可以使用 --minimumpriority 选项优化结果。

简而言之:PHPMD是一个很棒的工具,我真的很乐意使用它。它将检测代码中的许多潜在问题,并为您节省数小时的调试时间。

你的老板会很高兴他会把你的工资提高200%。保证。

PHPStan(PHP静态分析工具)

  • Github上

PHPStan是您工具箱中的另一个工具。它的目标是?编译时会显示编译语言等输出错误。它是PHPMD的一个很好的补充。

您可以按以下方式运行它:

$ phpstan analyse src/ --level=7

您可以使用级别选项精确地确定PHPStan的严格性。最小值是 level 0 最大值 level 7 。

这里给出一个输出示例:

------ -----------------------------------------------------------------------
  Line   src/MySuperModels/RandomModel
 ------ -----------------------------------------------------------------------
  78     Instantiated class App\Service\Api\InvalidArgumentException not found.
  82     Instantiated class App\Service\Api\InvalidArgumentException not found.
  93     Method App\Service\Api\Client\ClientInterface::post() invoked with 3 parameters, 4 required.
  103    Casting to string something that's already string.
 ------ -----------------------------------------------------------------------

与其他工具一样,您可以 创建自己的规则 。

PHPUnit和CRAP指标

  • Github上
  • 文档

本文不涉及单元测试。我假设您知道测试代码的单元远比本文中的任何内容更重要。

PHPUnit也可以显示一个非常有趣的信息: CRAP 指标。

CRAP使用 圈复杂度 和代码的代码覆盖率来显示应用程序中难以更改的代码。

更多CRAP索引很高,你的代码将被视为“糟糕”。

实际上,如果您的代码具有很高的复杂性但代码覆盖率很低,那么每次更改它时都会导致它出现不幸的错误。直到你的老板对你大喊大叫,你才会注意到。期待你的同事开发人员戴夫试图让你更加努力,让他在你的耻辱阴影中闪耀。

要显示CRAP指标,您需要生成代码覆盖率报告:

$ phpunit phpunit --coverage-html ./tempFolder

这将在 tempFolder 目录中创建HTML文件。您可以 index.html 在那里打开并单击仪表板链接以最终考虑CRAP指标。

前往CRAP中心的旅程

但请记住:代码覆盖率并不意味着您的代码经过了充分测试。这是我将为另一篇文章保留的完全不同的主题。

更深入地检查您的PHP代码

我使用以下工具来确保我工作的项目朝着正确的方向发展。他们可以帮助您了解全局。

当您需要处理未知(遗留)应用程序时,它们也可以成为真正的生命救星。它们可以为重构提供很大帮助。

PhpLoc

  • Github上

PhpLoc是一个非常好的工具,可以了解项目的大小。

您可以在您的代码库上执行:

$ phploc src

这将输出类似的东西:

Size
  Lines of Code (LOC)                               61
  Comment Lines of Code (CLOC)                       0 (0.00%)
  Non-Comment Lines of Code (NCLOC)                 61 (100.00%)
  Logical Lines of Code (LLOC)                      23 (37.70%)
    Classes                                         17 (73.91%)
      Average Class Length                          17
        Minimum Class Length                        17
        Maximum Class Length                        17
      Average Method Length                          3
        Minimum Method Length                        1
        Maximum Method Length                        7
    Functions                                        0 (0.00%)
      Average Function Length                        0
    Not in classes or functions                      6 (26.09%)

Cyclomatic Complexity
  Average Complexity per LLOC                     0.26
  Average Complexity per Class                    7.00
    Minimum Class Complexity                      7.00
    Maximum Class Complexity                      7.00
  Average Complexity per Method                   2.20
    Minimum Method Complexity                     1.00
    Maximum Method Complexity                     4.00

Dependencies
  Global Accesses                                    0
    Global Constants                                 0 (0.00%)
    Global Variables                                 0 (0.00%)
    Super-Global Variables                           0 (0.00%)
  Attribute Accesses                                 7
    Non-Static                                       7 (100.00%)
    Static                                           0 (0.00%)
  Method Calls                                      14
    Non-Static                                      14 (100.00%)
    Static                                           0 (0.00%)

Structure
  Namespaces                                         1
  Interfaces                                         0
  Traits                                             0
  Classes                                            1
    Abstract Classes                                 0 (0.00%)
    Concrete Classes                                 1 (100.00%)
  Methods                                            5
    Scope
      Non-Static Methods                             5 (100.00%)
      Static Methods                                 0 (0.00%)
    Visibility
      Public Methods                                 3 (60.00%)
      Non-Public Methods                             2 (40.00%)
  Functions                                          0
    Named Functions                                  0 (0.00%)
    Anonymous Functions                              0 (0.00%)
  Constants                                          1
    Global Constants                                 0 (0.00%)
    Class Constants                                  1 (100.00%)

这些数据可以为您提供有关该项目的一些线索:

  • Comment lines of code 永远不会好。不加思索地摆脱它。
  • 太高 Average Class length 通常也不好。拆分 神班 。
  • 太高 Average Method length 也不好。为了解雇你的同事,分开他们。
  • Cyclomatic complexity 可以指出一切和任何东西。信任 CRAP之类的 东西可能更明智。
  • 避免不必要 Dependencies 。

简而言之:一个非常简单而有价值的工具。

PHPCPD(PHP复制过去检测器)

  • Github上

PHPCPD将扫描您的代码库并输出重复的代码。

您可以输入以下命令来使用它:

$ phpcpd src/

PHPCPD将产生这种输出:

phpcpd 4.0.0 by Sebastian Bergmann.

Found 1 clones with 44 duplicated lines in 2 files:

  - /home/superUser/src/superFile.php:11-55
    /home/superUser/src/superFolder/superFile.php:11-55

5.04% duplicated lines out of 873 total lines of code.

Time: 29 ms, Memory: 4.00MB

您可以包含多个文件而不是整个目录,排除某些文件(或路径),甚至可以将结果输出到XML文件中。

但请记住:如果您在代码库中使用DRY原则违规,请记住, 代码重复并不一定意味着DRY违规。

PHPMND(PHP魔数检测器)

  • Github上
  • 文档

这个工具非常具体:它可以帮助您在代码中找到 魔术数字 。

最简单的使用方法:

$ phpmnd src/

这里输出:

--------------------------------------------------------------------------------

httpClient/myHttpClient.php:98. Magic number: 200
  > 98|         if ($response->getStatusCode() != 200) {

--------------------------------------------------------------------------------

service/superClass.php:47. Magic number: 8
  > 47|         for ($i = 0; $i < 8; $i++) {

--------------------------------------------------------------------------------

你可以玩很多选项,比如可以忽略数字,排除文件/路径/扩展......

dePHPend

  • Github上
  • 文档

你有没有在一个充满不必要的依赖项目上工作,想知道如何理解这个噩梦?你想验证你的精彩项目是否没有变成一个复杂的泥球大球吗?

dePHPend可以帮助您在这件事上隆重。

您可以按如下方式使用它:

$ dephpend metrics src/

然后这个输出将神奇地出现:

如您所见,dePHPend将输出 传入耦合 的数量, 传出耦合 的数量并显示基于它们的不稳定性指标。

明确:

App\Kernel
App\Kernel

这里的不稳定性评分很高:这个班级将其他课程结合在一起但从未使用过!

您也可以输出纯文本或UML。

流失的PHP

  • Github上

churn-php将根据 圈复杂度 和类的提交次数显示你应该重构的类。

这是一个非常有趣的方法。经常被修改的非常复杂的类确实很有可能引入错误。

作为其他工具,使用起来非常简单:

$ churn run src/

结果如下

+-------------------------------------------+---------------+------------+-------+
| File                                      | Times Changed | Complexity | Score |
+-------------------------------------------+---------------+------------+-------+
| src/Service/classToRefactor.php           | 12            | 8          | 0.441 |
| src/Service/anotherClass.php              | 3             | 15         | 0.185 |
+-------------------------------------------+---------------+------------+-------+

分数越高,重构的需求就越大。

PhpCodeFixer

  • Github上
  • 文档

不推荐的功能很糟糕。他们可以创建非常奇怪的错误,难以调试。此工具可以帮助您在闪亮的应用程序中检测它们。您可以精确地使用PHP的版本和主代码库目录,如下所示:

$ phpcf --target 7.1 src

这里通常可能的输出:

PhpMetrics

  • Github上
  • 文档

最后但同样重要的是:如果您是度量标准爱好者,PhpMetrics将是您的日常修复。它将输出 大量 有关您项目的指标。

你需要输入类似的东西:

$ phpmetrics --report-html=myreport.html src/

HTML输出将充满图表和数字。

现在请记住,指标不一定是绝对真理,它实际上取决于您的项目。我不会解释这个工具可以在这里输出的所有内容,也许在将来的文章中?

我们真的需要这些工具来检查我们的PHP代码吗?

我的经验告诉我, 软件熵 是真实的。您将修改更多应用程序,应用程序有更多机会破解。您的申请将不可避免地变得更加复杂。

这些PHP代码质量工具绝对可以帮助您解决这个问题。由于您的代码库将越来越多,因此重构是必需的,这些工具可以向您展示从哪里开始。每天,他们可以为您提供所需的所有这些小事,以保持您的代码库健康。

请记住:它们是一个很好的 补充,但不是一个可靠的测试套件的替代品 ,从良好的单元测试开始。

你使用的工具不是这里描述的工具吗?你用不同的方式吗?不要犹豫,通过分享您的经验来帮助社区。

快速参考

  • PHP-CS-定影液
    • 文档
    • Github上
  • PHPCS
    • 文档
    • Github上
  • PHPMD
    • Documenation
    • 官方网站
  • PHPStan
    • Github上
  • PHPUnit的
    • 文档
    • Github上
  • PHPLoc
    • Github上
  • PHPCPD
    • Github上
  • PHPMND
    • 文档
    • Github上
  • 流失的PHP
    • Github上
  • dePHPend
    • 官方网站
    • Github上
  • PhpCodeFixer
    • 文档
    • Github上
  • PhpMetrics
    • 官方网站
    • Github上

via https://thevaluable.dev/code-quality-check-tools-php/

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: