关于php:PHP-Linter-与规则定义小探

3次阅读

共计 3267 个字符,预计需要花费 9 分钟才能阅读完成。

本文旨在确认 PHPLint、PHP-CS-Fixer 和 PHP_CodeSniffer 的差别,依据以后公司的需要进行抉择,并编写一个简略的自定义规定。

Lint 工具浅析

PHPLint 是三者中我惟一用过的 Lint 工具,另外两个则是较为闻名的 PHP 畛域的自动化语法标准或动态谬误定位工具。

每个工具都在装置、运行的根底上,测试三块:

  1. 展现谬误,主动修复(如果有这个性能)
  2. 某一行代码跳过特定检测
  3. 切换规定汇合。
  4. 敞开一条规定。
  5. 写一个自定义规定。

参考开源社区的沉闷水平,本次次要的摸索点也会放在后两者上。

PHP-CS-Fixer

环境阐明,PHP 7.4 是它所需的最低版本。

提一嘴:请保障你的 PHP 起码处于 LTS 版本中,否则它将失去后续的安全补丁。

它反对多种装置形式:PHAR、Composer 等等。

通过 composer require friendsofphp/php-cs-fixer 装置,而后跑起来:vendor/bin/php-cs-fixer fix some_path

如果你装在全局,就不须要调用 vendor 目录的执行文件,不过考虑一下标准是否是全局的,否则写个 Shell 更适合。

展现谬误,主动修复

以我写的 Laravel Demo 为例:vendor/bin/php-cs-fixer fix app/Http/,胜利将我的 if (expression) once_line_code 给转化掉了,没啥故障。

应用 vendor/bin/php-cs-fixer fix app/Http --dry-run --diff,这样不会批改文件,并能获取检测后果的具体问题和举荐批改。

某一行代码跳过特定检测

基于 Issue 4512,暂不反对。

切换规定汇合

通过 /.php-cs-fixer.dist.php,你能够不便的定义本人的配置文件——外面涵盖了具体规定、规定汇合、待查看的文件目录、剔除查看的目录等的变更。

简略的尝试:替换为 PSR12 并开启不平安修复模式,没问题。

敞开某条规定

这个工具采纳的是最小规定默认,所以在配置文件中不蕴含,就能够放弃对应规定的检测。

CI

官网提供了对应的命令,使你高效的将其纳入 CI 构建流程。

编写自定义规定

尝试增加了一条 App/test_rule 规定。长处如下:

  1. 编写简略,在接口束缚的前提下,基本上都是可读的 Function 编写;
  2. 规定寄存灵便,规定类能够间接放在任意我的项目门路下——写个包隔离进来也能够,如果你喜爱;
  3. 参考性强,只管不足 足够的 自定义规定编写指南,但你很容易就找到了所有的规定类,浏览、了解、编程,很好的循环。
  4. 基本上遵循 \PhpCsFixer\Fixer\FixerInterface 接口即可,更多的自行参考文档。

PHP_CodeSniffer

环境阐明,PHP 5.4 是它所需的最低版本,但特定规定须要更高版本的 PHP 反对。

与 CS-Fixer 相似,也提供了多种装置形式,老样子:

composer require "squizlabs/php_codesniffer=*"

展现谬误,主动修复

以我写的 Laravel Demo 为例:./vendor/bin/phpcs app/Http/

显示出了稀稀拉拉的谬误数量提醒:Line | Level | Message。很好,有 PHPLint 的滋味了。

它的一个工具:phpcbf 能够让你主动修复发现的问题——如果能主动修复的话。

如果咱们心愿接入 CI,PHP CS 提供了对应的 Action,你能够将其融入到构建流程。

某一行代码跳过特定检测

CS 提供了跳过文件、跳过某行、临时敞开,乃至下一行不检测某个规定。

简略测试了上述的,譬如通过 // phpcs:ignore,能够跳过某行检测,从文档里你能够找到更多、更具体的解释。

切换规定汇合

通过 .phpcs.xml 或相似的文件(它居然反对数个不同的名字……),咱们能够定义配置:

<rule ref="/path/to/standards/Generic/Sniffs/Commenting/TodoSniff.php"/>

这样就增加了对应的 ToDo Sniff 规定。

敞开某条规定

与 CS Fixer 统一,只有不蕴含对应规定即可。咱们感触到它默认反对很多规定,是因为它的默认配置比拟全面。

命名相较 CS Fixer 更简略,但规定列表比拟难找。

CI

PHP CS 官网反对的是 Github CI Action,对于散发和 diff 需要,并没有适合的反对。

尽管如此,你能够通过 diffFilter 为其提供基于 commit 或 PR 范畴的正当提醒。

尝试了一下,调整 Shell 和钩子相比拟 PHP CS Fixer 稍微耗时。

编写自定义规定

CS 将规定称说为嗅探器(Sniff),反对 PSR2、PSR12 等通用规定。感觉规定比 Fixer 提供的少一些,不过没关系,咱们来尝试增加了一条 test_rule 规定。

首先指出,CS 有残缺地 Step-To-Step 教程领导你如何写本人的规定,如果你心愿应用 CS 在本人的技术栈中,举荐间接浏览它(官网的 Wiki 指南),而不是我这样的博客文章。

动工。

首先,让咱们像 Fixer 一样,在我的项目中间接创立本人的规定目录和文件,放弃灵便的同时,前期仍旧能够将其抽离为 Composer Package。

咱们管包容自定义规定 汇合、定义文件等的目录叫 MyStandard,进入其中并创立 ruleset.xml——它能够定义规定具体的条件。

格局大略为:

<?xml version="1.0"?>
<ruleset name="MyStandard">
  <description>A custom coding standard.</description>
</ruleset>

所以,这个规定就被称为 MyStandard 规定集,外面将蕴含一个或若干的理论嗅探器来执行查看。

接着创立目录 MyStandard/Sniffs,为了不让你困惑,我间接用嵌套构造示意它的理论地位。这里将包容嗅探器文件。

而后咱们对评论进行嗅探,持续创立目录 MyStandard/Sniffs/Commenting,在其中创立 DisallowHashCommentsSniff.php 嗅探器(文件)。

Sniffs 下的目录其实不重要,只是为了不便咱们将更多嗅探器辨别开,你如果喜爱,也能够将百十来个规定丢在一起,实现软件工程师们疾恶如仇的“大杂烩”(:D)。

与 Fixer 一样,它也规定了一个接口——Only Once,PHP_CodeSniffer\Sniffs\Sniff,继承并实现要害办法就好。

  • supportedTokenizers 属性定义:嗅探的文件类型,PHP、JS、Rust、etc.
  • register 办法定义:嗅探的代码类型,单行正文、多行正文、单行代码、代码块、etc.
  • process 办法定义:理论的谬误查看、解决。

    • 零碎提供了 addError / addWarning 作为报错信息的增加办法。
    public function process(File $phpcsFile, $stackPtr)
    {$tokens = $phpcsFile->getTokens();
        if ($tokens[$stackPtr]['content']{0} === '#') {
            $error = 'Hash comments are prohibited; found %s';
            $data  = array(trim($tokens[$stackPtr]['content']));
            $phpcsFile->addError($error, $stackPtr, 'Found', $data);
        }
    }

最终,咱们采纳 phpcs --standard=/path/to/MyStandard has_error_code.php 尝试检测一个 has_error_code.php 文件,外面蕴含了一些谬误。

/path/to/MyStandard 定义了咱们规定汇合的地位,以帮忙 CS 寻找包外的规定集。

试试看吧!

最初,嗅探的文件类型不反对 Rust,那是开玩笑的——只管你能够让它反对——这很诡异。
无论怎样,更喜爱哪个工具,都祝你玩的欢快!

正文完
 0