它们由您的同事开发人员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-CS-Fixer(PHP编码标准修复程序)
- Github上
- 文档
我个人对代码格式没有任何偏好。我关心的是拥有 一致的 :
- 它更容易阅读
- 它让你的思想更加重要
使用以下命令,您可以格式化整个代码库:
$ php-cs-fixer fix src/
您也可以在不应用它们的情况下预览修改(
--diff
选项),或者您可以精确 --rules
选择要使用的规则(选项)。PHPCS(PHP CodeSniffer)
- Github上
- 文档
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 src/ text cleancode
PHPMD将扫描项目的目录和子目录,并以纯文本形式输出发现的错误。您也可以通过替换上面命令行中的选项来创建
html
或 xml
输出 text
。在此示例中,我们使用
cleancode
规则集,但您显然可以更改它或创建自己的规则集。您想要在文件中输出错误吗?简单:
$ phpmd src/ html cleancode --reportfile ~/phpmd.html
如果选择
xml
输出,您将获得有关规则集的更多信息,如下所示:The method notThatCoolMethod has a boolean flag argument $badBoolean, which is a certain sign of a Single Responsibility Principle violation. The method superMethod uses an else expression. Else is never necessary and you can simplify the code to work without else.
您可以看到例如违反规则的优先级。然后,您可以使用
--minimumpriority
选项优化结果。简而言之:PHPMD是一个很棒的工具,我真的很乐意使用它。它将检测代码中的许多潜在问题,并为您节省数小时的调试时间。
你的老板会很高兴他会把你的工资提高200%。保证。
PHPStan(PHP静态分析工具)
- Github上
您可以按以下方式运行它:
$ phpstan analyse src/ --level=7
您可以使用级别选项精确地确定PHPStan的严格性。最小值是
level 0
最大值 level 7
。这里给出一个输出示例:
------ ----------------------------------------------------------------------- Linesrc/MySuperModels/RandomModel ------ ----------------------------------------------------------------------- 78Instantiated class App\Service\Api\InvalidArgumentException not found. 82Instantiated class App\Service\Api\InvalidArgumentException not found. 93Method App\Service\Api\Client\ClientInterface::post() invoked with 3 parameters, 4 required. 103Casting 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 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%) Classes17 (73.91%) Average Class Length17 Minimum Class Length17 Maximum Class Length17 Average Method Length3 Minimum Method Length1 Maximum Method Length7 Functions0 (0.00%) Average Function Length0 Not in classes or functions6 (26.09%)Cyclomatic Complexity Average Complexity per LLOC0.26 Average Complexity per Class7.00 Minimum Class Complexity7.00 Maximum Class Complexity7.00 Average Complexity per Method2.20 Minimum Method Complexity1.00 Maximum Method Complexity4.00Dependencies Global Accesses0 Global Constants0 (0.00%) Global Variables0 (0.00%) Super-Global Variables0 (0.00%) Attribute Accesses7 Non-Static7 (100.00%) Static0 (0.00%) Method Calls14 Non-Static14 (100.00%) Static0 (0.00%)Structure Namespaces1 Interfaces0 Traits0 Classes1 Abstract Classes0 (0.00%) Concrete Classes1 (100.00%) Methods5 Scope Non-Static Methods5 (100.00%) Static Methods0 (0.00%) Visibility Public Methods3 (60.00%) Non-Public Methods2 (40.00%) Functions0 Named Functions0 (0.00%) Anonymous Functions0 (0.00%) Constants1 Global Constants0 (0.00%) Class Constants1 (100.00%)
这些数据可以为您提供有关该项目的一些线索:
-
Comment lines of code
永远不会好。不加思索地摆脱它。
- 太高
Average Class length
通常也不好。拆分 神班 。
- 太高
Average Method length
也不好。为了解雇你的同事,分开他们。
-
Cyclomatic complexity
可以指出一切和任何东西。信任 CRAP之类的 东西可能更明智。
- 避免不必要
Dependencies
。
PHPCPD(PHP复制过去检测器)
- Github上
您可以输入以下命令来使用它:
$ 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-555.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 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上
- 文档
$ phpcf --target 7.1 src
这里通常可能的输出:
文章图片
PhpMetrics
- Github上
- 文档
你需要输入类似的东西:
$ phpmetrics --report-html=myreport.html src/
HTML输出将充满图表和数字。
现在请记住,指标不一定是绝对真理,它实际上取决于您的项目。我不会解释这个工具可以在这里输出的所有内容,也许在将来的文章中?
我们真的需要这些工具来检查我们的PHP代码吗? 我的经验告诉我, 软件熵 是真实的。您将修改更多应用程序,应用程序有更多机会破解。您的申请将不可避免地变得更加复杂。
这些PHP代码质量工具绝对可以帮助您解决这个问题。由于您的代码库将越来越多,因此重构是必需的,这些工具可以向您展示从哪里开始。每天,他们可以为您提供所需的所有这些小事,以保持您的代码库健康。
请记住:它们是一个很好的 补充,但不是一个可靠的测试套件的替代品 ,从良好的单元测试开始。
你使用的工具不是这里描述的工具吗?你用不同的方式吗?不要犹豫,通过分享您的经验来帮助社区。
快速参考
- PHP-CS-定影液
- 文档
- Github上
- 文档
- PHPCS
- 文档
- Github上
- 文档
- PHPMD
- Documenation
- 官方网站
- Documenation
- PHPStan
- Github上
- Github上
- PHPUnit的
- 文档
- Github上
- 文档
- PHPLoc
- Github上
- Github上
- PHPCPD
- Github上
- Github上
- PHPMND
- 文档
- Github上
- 文档
- 流失的PHP
- Github上
- Github上
- dePHPend
- 官方网站
- 【用于检查和改进代码的PHP代码质量工具】Github上
- 官方网站
- PhpCodeFixer
- 文档
- Github上
- 文档
- PhpMetrics
- 官方网站
- Github上
- 官方网站
原文转自:
https://mp.weixin.qq.com/s/PhyR3CpNg4HRvf3TrFiUpA
推荐阅读
- 对GO切片的理解
- 小程序商城网站开发秒杀模块篇
- 盲盒购物网站系统开发建设 第三篇
- Netty核心概念之ChannelHandler&Pipeline&ChannelHandlerContext
- 简单的线程池实现多线程对大文件的读取
- SSH 端口转发与 SOCKS 代理
- Ubuntu16.04/Scala2.11.8安装教程
- 学习PHP中的高精度计时器HRTime扩展
- 使用OpenResty+Lua实现灰度测试(金丝雀)
- 使用源码编译安装PHP扩展