共计 3267 个字符,预计需要花费 9 分钟才能阅读完成。
本文旨在确认 PHPLint、PHP-CS-Fixer 和 PHP_CodeSniffer 的差别,依据以后公司的需要进行抉择,并编写一个简略的自定义规定。
Lint 工具浅析
PHPLint 是三者中我惟一用过的 Lint 工具,另外两个则是较为闻名的 PHP 畛域的自动化语法标准或动态谬误定位工具。
每个工具都在装置、运行的根底上,测试三块:
- 展现谬误,主动修复(如果有这个性能)
- 某一行代码跳过特定检测
- 切换规定汇合。
- 敞开一条规定。
- 写一个自定义规定。
参考开源社区的沉闷水平,本次次要的摸索点也会放在后两者上。
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
规定。长处如下:
- 编写简略,在接口束缚的前提下,基本上都是可读的 Function 编写;
- 规定寄存灵便,规定类能够间接放在任意我的项目门路下——写个包隔离进来也能够,如果你喜爱;
- 参考性强,只管不足 足够的 自定义规定编写指南,但你很容易就找到了所有的规定类,浏览、了解、编程,很好的循环。
- 基本上遵循
\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,那是开玩笑的——只管你能够让它反对——这很诡异。
无论怎样,更喜爱哪个工具,都祝你玩的欢快!