fig-r/psr2r-sniffer

PSR2-R 代码嗅探器、自动修复器和标记化工具

安装次数: 793,310

依赖者: 95

建议者: 0

安全性: 0

星星: 32

关注者: 6

分支: 8

开放问题: 1

类型:phpcodesniffer-standard

2.1.0 2024-03-29 22:38 UTC

README

CI Latest Stable Version Minimum PHP Version License Total Downloads Coding Standards

有关 PSR-2-R 的详细信息,请参阅fig-rectified-standards

有关 PHP 版本兼容性,请参阅版本映射

文档 @ /docs/.

此分支适用于 PHP 8.1+ 仓库。

包含的嗅探器

以下嗅探器已经捆绑为 PSR2R,但您也可以以任何方式单独使用它们。

目前,PSR2R 随附超过 190 个嗅探器。

此外,以下建议添加

  • PhpCollective.Commenting.DocBlockThrows
  • PhpCollective.Commenting.DocBlockTagGrouping
  • SlevomatCodingStandard.Functions.DisallowEmptyFunction
  • SlevomatCodingStandard.PHP.UselessParentheses

此库使用 squizlabs/PHP_CodeSniffer。它可以检测所有问题,并自动修复其中的一些,非常适合 CI 集成(travis、jenkins、circleci、GA 等)。

用法

如何在项目中使用

您可能正在使用 composer。因此,将其放入 require-dev 依赖项中

composer require --dev fig-r/psr2r-sniffer

在库的根目录中设置一个 phpcs.xml。在此定义要使用的标准以及项目路径,通常是

<rule ref="vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml"/>

<file>src/</file>
<file>tests/</file>

然后您可以使用它像这样

// Sniffs only
vendor/bin/phpcs {path/file}

// Sniffs and fixes
vendor/bin/phpcbf {path/file}

如果要在定义的路径的子集上运行它,则路径是可选的。否则,它默认为 XML 文件中定义的路径。

自定义

您可以始终进一步自定义您的 phpcs.xml,例如。

<?xml version="1.0"?>
<ruleset name="app">

	<arg value="nps"/>

	<file>src/</file>
	<file>tests/</file>

	<exclude-pattern>/config/Migrations/</exclude-pattern>

	<!-- Add main ruleset -->
	<rule ref="vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml"/>

	<!-- Silence certain sniffs/rules -->
	<rule ref="PSR2.Methods.MethodDeclaration.Underscore">
		<severity>0</severity>
	</rule>
	<rule ref="PSR2.Classes.PropertyDeclaration.Underscore">
		<severity>0</severity>
	</rule>

	<!-- Define your own additional sniffs here -->

</ruleset>

有用的命令

使用 -v 的详细输出始终很有用。使用 -vv 或甚至 -vvv 您可以获得更多的调试输出。

如果您想要此标准的所有嗅探器的列表,请使用 -e

vendor/bin/phpcs -e

它将按标准名称和嗅探器类型分组列出它们。

要仅运行单个嗅探器,请使用 --sniffs=... 和逗号分隔的嗅探器列表,例如。

vendor/bin/phpcs --sniffs=PSR2R.Files.EndFileNewline

通常,如果您在您的整个存储库上运行它,您可能希望排除如 tests/test_files/ 这样的目录

vendor/bin/phpcs --ignore=/tests/test_files/

Windows 用法

对于 Win OS,您应该使用 \ 作为分隔符

vendor\bin\phpcs

通过快捷键将其包含到您的 IDE 中

例如,对于 PHPStorm

  • 打开设置 -> 工具 -> 外部工具
  • 添加一个名为 "cs-sniffer" 的新工具,将程序设置为 $ProjectFileDir$/vendor/bin/phpcs,将参数设置为 --standard=$ProjectFileDir$/vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml -p $FilePath$,将工作目录设置为 $ProjectFileDir$
  • 添加一个名为 "cs-fixer" 的新工具,将程序设置为 $ProjectFileDir$/vendor/bin/phpcbf,将参数设置为 --standard=$ProjectFileDir$/vendor/fig-r/psr2r-sniffer/PSR2R/ruleset.xml -v $FilePath$,将工作目录设置为 $ProjectFileDir$
  • 如果不需要在此处查看任何修复器的输出,则可选地取消选中 "打开控制台"。
  • 现在在设置 -> 快捷键(搜索 cs-sniffer 和 cs-fixer)下设置您的快捷键。例如,Control + Comma 用于嗅探,Control + Dot 用于修复。
将其集成到您的 IDE 中以实现实时修复

您还可以轻松地为您的 IDE 创建一个 "watcher",这样您在工作的任何文件都会在(自动)保存时自动修复。但是在这里,您最好只允许添加不删除任何内容的特定嗅探器。

注意:例如对于PHPStorm,请确保将显示控制台切换到从不,以免它一直打扰你。

编写新的sniffs

您可以通过按照PSR-2-R标准添加新的sniffs来做出贡献。

分词工具

查看分词的代码样子非常有帮助。因此,我们可以使用以下工具将PHP文件解析为其标记

bin/tokenize /path/to/file

(如果您从您的应用程序中运行此工具,它将必须作为vendor/bin/tokenize运行)

更详细的输出

bin/tokenize /path/to/file -v

对于MyClass.php文件,它将在同一文件夹中创建一个标记文件MyClass.tokens.php

PHP代码单行示例输出

...
    protected static function _optionsToString($options) {
// T_WHITESPACE T_PROTECTED T_WHITESPACE T_STATIC T_WHITESPACE T_FUNCTION T_WHITESPACE T_STRING T_OPEN_PARENTHESIS T_VARIABLE T_CLOSE_PARENTHESIS T_WHITESPACE T_OPEN_CURLY_BRACKET T_WHITESPACE
...

使用详细选项

...
    protected static function _optionsToString($options) {
// T_WHITESPACE (935) code=379, line=105, column=1, length=1, level=1, conditions={"9":358}, content=`\t`
// T_PROTECTED (936) code=348, line=105, column=2, length=9, level=1, conditions={"9":358}, content=`protected`
// T_WHITESPACE (937) code=379, line=105, column=11, length=1, level=1, conditions={"9":358}, content=` `
// T_STATIC (938) code=352, line=105, column=12, length=6, level=1, conditions={"9":358}, content=`static`
// T_WHITESPACE (939) code=379, line=105, column=18, length=1, level=1, conditions={"9":358}, content=` `
// T_FUNCTION (940) code=337, line=105, column=19, length=8, parenthesis_opener=943, parenthesis_closer=945, parenthesis_owner=940, scope_condition=940, scope_opener=947, scope_closer=1079, level=1, conditions={"9":358}, content=`function`
// T_WHITESPACE (941) code=379, line=105, column=27, length=1, level=1, conditions={"9":358}, content=` `
// T_STRING (942) code=310, line=105, column=28, length=16, level=1, conditions={"9":358}, content=`_optionsToString`
// T_OPEN_PARENTHESIS (943) code=PHPCS_T_OPEN_PARENTHESIS, line=105, column=44, length=1, parenthesis_opener=943, parenthesis_owner=940, parenthesis_closer=945, level=1, conditions={"9":358}, content=`(`
// T_VARIABLE (944) code=312, line=105, column=45, length=8, nested_parenthesis={"943":945}, level=1, conditions={"9":358}, content=`$options`
// T_CLOSE_PARENTHESIS (945) code=PHPCS_T_CLOSE_PARENTHESIS, line=105, column=53, length=1, parenthesis_owner=940, parenthesis_opener=943, parenthesis_closer=945, level=1, conditions={"9":358}, content=`)`
// T_WHITESPACE (946) code=379, line=105, column=54, length=1, level=1, conditions={"9":358}, content=` `
// T_OPEN_CURLY_BRACKET (947) code=PHPCS_T_OPEN_CURLY_BRACKET, line=105, column=55, length=1, bracket_opener=947, bracket_closer=1079, scope_condition=940, scope_opener=947, scope_closer=1079, level=1, conditions={"9":358}, content=`{`
// T_WHITESPACE (948) code=379, line=105, column=56, length=0, level=2, conditions={"9":358,"940":337}, content=`\n`
...