当前位置: 首页 > 后端技术 > PHP

PHPLinter和规则定义小探索

时间:2023-03-29 21:19:57 PHP

本文旨在确认PHPLint、PHP-CS-Fixer和PHP_CodeSniffer的区别,根据当前公司的需求进行选择,编写一个简单的自定义规则。Lint工具分析PHPLint是三者中我唯一用过的Lint工具,另外两个是PHP领域比较知名的自动语法规范或者静态错误定位工具。每个工具在安装运行的基础上分三个部分进行测试:显示错误、自动修复(如果有此功能)、某行代码跳过特定的检测切换规则集。关闭规则。编写自定义规则。参考开源社区的活跃度,本次的主要探索点也会在后两者上。PHP-CS-Fixer环境声明PHP7.4是它需要的最低版本。提醒一句:确保你的PHP至少是LTS版本,否则会丢失后续的安全补丁。支持多种安装方式:PHAR、Composer等。通过composer安装需要friendsofphp/php-cs-fixer,然后运行:vendor/bin/php-cs-fixerfixsome_path。如果是全局安装,则不需要调用vendor目录下的可执行文件,但要考虑规范是否是全局的,否则还是写一个Shell比较合适。显示错误并自动修复它们。以我写的LaravelDemo为例:vendor/bin/php-cs-fixerfixapp/Http/,成功转换了我的if(expression)once_line_code,没有任何问题。使用vendor/bin/php-cs-fixerfixapp/Http--dry-run--diff,这样文件不会被修改,可以得到检测结果的具体问题和修改建议。一行代码跳过特定检测基于Issue4512,目前不支持。切换规则集通过/.php-cs-fixer.dist.php,你可以很方便的定义自己的配置文件——包含具体规则的变化,规则集,需要检查的文件目录,需要检查的目录等。简单尝试:更换为PSR12并启用不安全修复模式,没问题。禁用某条规则,本工具默认使用最小规则,所以如果配置文件中没有包含,则可以放弃对相应规则的检测。CI官方提供了相应的命令,可以让你高效的融入到CI的构建过程中。编写自定义规则尝试添加App/test_rule规则。优点是:容易写,在接口约束的前提下,基本写成一个可读的函数;灵活的规则存储,规则类可以直接放在任何项目路径下——如果你愿意,你也可以写一个包来隔离它;参考性强,虽然缺少足够的自定义规则编写指南,但可以轻松找到所有的规则类,阅读、理解、编程,良性循环。基本遵循\PhpCsFixer\Fixer\FixerInterface接口,更多的可以参考文档。PHP_CodeSniffer环境声明PHP5.4是它需要的最低版本,但某些规则需要支持更高版本的PHP。与CS-Fixer类似,它也提供了多种安装方式,一如往常:composerrequire"squizlabs/php_codesniffer=*"显示错误并自动修复。以我写的LaravelDemo为例:./vendor/bin/phpcsapp/Http/.显示密密麻麻的错误提示:Line|级别|信息。好吧,它闻起来像PHPLint。它的工具之一:phpcbf允许您自动修复发现的问题——如果它可以自动修复的话。如果我们要访问CI,PHPCS提供了相应的Action,你可以集成到构建过程中。某行代码跳过具体检测CS提供了跳过文件,跳过某行,暂时关闭,甚至下一行不检测某条规则。简单测试了上面,比如通过//phpcs:ignore,可以跳过某行检测,从文档中可以找到更多更详细的解释。Togglerulesets通过.phpcs.xml或类似的(它实际上支持几种不同的名称...),我们可以定义配置:这里添加了相应的ToDoSniff规则。关闭一个规则和CSFixer是一致的,只要不包含对应的规则即可。我们感觉它默认支持很多规则,因为它的默认配置比较全面。命名比CSFixer简单,但规则列表更难找。CIPHPCS官方支持GithubCIAction,它对分发和差异要求没有适当的支持。不过,您可以通过diffFilter根据提交或PR范围给它合理的提示。试用了一下,调整shell和hooks比PHPCSFixer稍微费点时间。编写自定义规则CS将规则称为嗅探器(Sniff),支持PSR2、PSR12等通用规则。感觉规则比Fixer提供的少,不过没关系,我们试试加一条test_rule规则吧。首先,CS有一个完整的Step-To-Step教程来指导你如何编写自己的规则。如果你想在自己的技术栈中使用CS,建议直接阅读(官方Wiki指南),而不是像我这篇文章那样的博客。开始。首先让我们像Fixer一样直接在工程中创建自己的rule目录和文件,在保持灵活性的同时,后面还是可以抽取成ComposerPackage。让我们将包含自定义规则集、定义文件等的目录称为MyStandard,进入其中并创建ruleset.xml-它可以定义规则的特定条件。格式大致为:Acustomcodingstandard.因此,这条规则被称为MyStandard规则集。它将包含一个或多个实际的嗅探器来执行检查。然后创建目录MyStandard/Sniffs。为了不让你迷惑,我直接用嵌套结构来表示它的实际位置。这将存放嗅探器文件。然后我们嗅探评论,继续创建目录MyStandard/Sniffs/Commenting,在其中创建DisallowHashCommentsSniff.php嗅探器(文件)。Sniffs下的目录其实并不重要,只是为了方便我们区分更多的嗅探器,如果你愿意,也可以把一百条左右的规则拼凑起来,实现软件工程师讨厌的“大杂烩”(:D).和Fixer一样,它也指定了一个接口——OnlyOnce,PHP_CodeSniffer\Sniffs\Sniff,只是继承并实现了关键方法。supportedTokenizers属性定义:嗅探文件类型、PHP、JS、Rust等注册方法定义:嗅探代码类型、单行注释、多行注释、单行代码、代码块等处理方法定义:实际错误检查,处理。系统提供了addError/addWarning作为添加错误信息的方法。publicfunctionprocess(File$phpcsFile,$stackPtr){$tokens=$phpcsFile->getTokens();}if($tokens[$stackPtr]['content']{0}==='#'){$error='哈希注释被禁止;找到%s';$data=array(trim($tokens[$stackPtr]['content']));$phpcsFile->addError($error,$stackPtr,'Found',$data);最后,我们使用phpcs--standard=/path/to/MyStandardhas_error_code.php来尝试检测包含一些错误的has_error_code.php文件。/path/to/MyStandard定义了我们的规则集的位置,以帮助CS在包外找到规则集。尝试一下!最后,嗅探到的文件类型不支持Rust,这是个笑话——尽管你可以让它支持它——这很奇怪。无论您喜欢哪种工具,都可以玩得开心!