fig-r / psr2r-sniffer
PSR2-R 代码嗅探器、自动修复器和标记化工具
Requires
- php: >=8.1
- php-collective/code-sniffer: ^0.2.6
- slevomat/coding-standard: ^8.3.0
- squizlabs/php_codesniffer: ^3.7.0
Requires (Dev)
- phpstan/phpstan: ^1.0.0
- phpunit/phpunit: ^10.3
README
有关 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` ...