brianvarskonst / coding-standard
CodeSniffer 的编码标准规则,用于编写一致的 PHP 代码
Requires
- php: >=8.0
- dealerdirect/phpcodesniffer-composer-installer: ^1.0
- escapestudios/symfony2-coding-standard: ^3.10.0
- phpcsstandards/phpcsutils: ^1.0
- slevomat/coding-standard: ^8.15.0
- squizlabs/php_codesniffer: ^3.8
Requires (Dev)
- ergebnis/composer-normalize: ^2.8
- phpstan/phpstan: ^1
- phpstan/phpstan-strict-rules: ^1
- phpunit/phpunit: ^9.3
- symfony/var-dumper: ^7.1
This package is auto-updated.
Last update: 2024-09-26 12:42:38 UTC
README
提供 Brianvarskonst 编码标准的 PHP CodeSniffer 规则集
概述
Brianvarskonst 编码标准是 Symfony 编码标准 的扩展,并增加了确保代码质量和一致性的特定规则。
PHP 8.0+ 编码标准
规则
Brianvarskonst.Array.ArrayDoubleArrowAlignment
=>
操作符必须在关联数组中对齐。- 键和
=>
操作符必须在数组中位于同一行。
Brianvarskonst.Array.MultiLineArray
- 在多行数组中,开括号后必须跟一个换行符。
- 闭括号必须独占一行。
- 多行数组中的元素必须缩进。
Brianvarskonst.Formatting.AlphabeticalUseStatements
use
语句必须按字典顺序排序。- 通过
order
属性配置排序顺序。
配置
Brianvarskonst.Formatting.AlphabeticalUseStatements
的 order
属性定义了用于排序的函数。
排序的可能值
dictionary
(默认):基于 strcmp,命名空间分隔符位于任何其他字符之前use Doctrine\ORM\Query; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder;
string
:使用 strcmp 的二进制安全的字符串比较use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\Expr; use ExampleSub; use Examples;
string-locale
:使用 strcoll 的基于区域的字符串比较string-case-insensitive
:使用 strcasecmp 的二进制安全的不区分大小写的字符串比较use Examples; use ExampleSub;
要更改项目中排序顺序,请将以下片段添加到自定义 ruleset.xml
<rule ref="Brianvarskonst.Formatting.AlphabeticalUseStatements"> <properties> <property name="order" value="string-locale"/> </properties> </rule>
Brianvarskonst.Formatting.UnnecessaryNamespaceUsageSniff
- 当使用
use
语句导入时,必须使用导入的类名。
Brianvarskonst.String.VariableInDoubleQuotes
- 双引号字符串中的插值变量必须用
{}
包围,例如{$VAR}
而不是$VAR
。
Brianvarskonst.WhiteSpace.ConstantSpacing
const
后必须跟一个空格。
Brianvarskonst.WhiteSpace.MultipleEmptyLines
来源: mediawiki/mediawiki-codesniffer
- 不允许存在多于一个连续的空行。
Brianvarskonst.Usage.ElementNameMinimalLength
- 函数、类、接口、特质和常量必须使用最小长度的名称(默认 3 个字符)。
- 通过
minLength
和allowedShortNames
配置。
<rule ref="Brianvarskonst.Usage.ElementNameMinimalLength"> <properties> <property name="minLength" value="5"/> <property name="allowedShortNames" type="array" value="id,db,ok,x,y"/> </properties> </rule>
也可以通过 additionalAllowedNames
配置扩展白名单,例如。
<rule ref="Brianvarskonst.Usage.ElementNameMinimalLength"> <properties> <property name="additionalAllowedNames" type="array" value="i,j" /> </properties> </rule>
Brianvarskonst.Complexity.NestingLevel
- 确保函数/方法内的最大嵌套级别。
- 默认情况下,在级别 3 时触发警告,在级别 5 时触发错误。
- 通过
warningLimit
和errorLimit
配置。
例如
function foo(bool $level_one, array $level_two, bool $level_three) { if ($level_one) { foreach ($level_two as $value) { if ($level_three) { return $value; } } } return ''; }
示例代码包含一个 3 级嵌套级别。
默认情况下,如果嵌套等于或大于 3,则触发 警告,如果嵌套等于或大于 5,则触发 错误。
可以通过分别通过 warningLimit
和 errorLimit
属性来定制警告和错误限制。
<rule ref="Brianvarskonst.Complexity.NestingLevel"> <properties> <property name="warningLimit" value="5" /> <property name="errorLimit" value="10" /> </properties> </rule>
存在一个例外。通常,try
/catch
/finally
块会计算嵌套级别,但此嗅探器忽略了由函数内部的 try
/catch
/finally
造成的级别增加。
例如,以下代码是可行的
function bar(array $data, string $foo): string { // Indent level 1 try { $encoded = json_encode($data, JSON_THROW_ON_ERROR); // Indent level 2 if ($encoded) { // Indent level 3 if ($append !== '') { return $encoded . $foo; } return $encoded; } return ''; } catch (\Throwable $e) { return ''; } }
事实上,嵌套的两个if
将占据2个缩进级别,加上3个级别的try
/catch
块,但由于try
/catch
直接位于函数内部,所以会被忽略,因此sniff所考虑的最大级别是2,这在限制范围内。
关于try
/catch
/finally
块的这个异常可以通过ignoreTopLevelTryBlock
属性禁用
<rule ref="Brianvarskonst.Complexity.NestingLevel"> <properties> <property name="errorLimit" value="10" /> <property name="ignoreTopLevelTryBlock" value="false" /> </properties> </rule>
Brianvarskonst.Classes.PropertyPerClassLimit
- 确保每个类(默认10个)的最大属性数。
- 可以通过
maxCount
进行配置。
<rule ref="Brianvarskonst.Classes.PropertyPerClassLimit"> <properties> <property name="maxCount" value="120" /> </properties> </rule>
Brianvarskonst.Namespace.Psr4
- 强制执行PSR-4自动加载标准。
- 可配置以匹配
composer.json
自动加载设置。
我们的风格强制使用PSR-4进行自动加载。此sniff使用一些配置来检查包含类的文件是否使用PSR-4期望的结构保存。如果没有提供配置,sniff只检查类名和文件名匹配,但这并不是PSR-4的保证。
所需的配置与composer.json
中PSR-4配置相同
{ "autoload": { "psr-4": { "Brianvarskonst\\Foo\\": "src/" } }, "autoload-dev": { "psr-4": { "Brianvarskonst\\Foo\\Tests\\": "tests/php/" } } }
规则配置应为
<rule ref="Brianvarskonst.Namespace.Psr4"> <properties> <property name="psr4" type="array" value="Brianvarskonst\Foo=>src,Brianvarskonst\Foo\Tests=>tests/php" /> </properties> </rule>
请注意,当提供PSR-4配置时,所有可自动加载的实体(类/接口/特质)都将被检查是否符合规范。如果sniffer目标路径中有不符合PSR-4规范的实体(例如,通过classmap加载或根本不自动加载),则应通过exclude
属性排除,例如
<rule ref="Brianvarskonst.Namespace.Psr4"> <properties> <property name="psr4" type="array" value="Brianvarskonst\SomeCode=>src" /> <property name="exclude" type="array" value="Brianvarskonst\ExcludeThis,Brianvarskonst\AndThis" /> </properties> </rule>
请注意,任何以exclude
数组中任何值开头的项目都将被排除。
例如,通过排除Brianvarskonst\ExcludeThis
,将排除类似Brianvarskonst\ExcludeThis\Foo
和Brianvarskonst\ExcludeThis\Bar\Baz
的项目。
要确保要排除的是命名空间,而不是具有相同名称的类,只需使用\
作为最后一个字符。
包含的规则
其他标准中还有更多规则被导入,具体请参阅ruleset.xml
。
大多数问题都可以使用phpcbf
自动修复。
PSR-1,PSR-2,PSR-12
有关从PHP标准建议(PSR)包含的规则的信息,请参阅官方文档
Slevomat
一些规则已从Slevomat编码标准中包含。
Symfony
一些规则已从Symfony编码标准中包含。
通用规则
一些规则也来自PHP_CodeSniffer本身,以及PHPCSExtra。
要求
安装
Composer
使用Composer是首选方法。
- 将Brianvarskonst编码标准添加到
composer.json
$ composer require --dev brianvarskonst/coding-standard
- 使用编码标准
$ ./vendor/bin/phpcs --standard=Brianvarskonst path/to/my/file.php
- 可选地,将Brianvarskonst设置为默认编码标准
$ ./vendor/bin/phpcs --config-set default_standard Brianvarskonst
源代码
- 克隆存储库
$ git clone https://github.com/brianvarskonst/coding-standard.git
- 安装依赖项
$ composer install
- 验证编码标准
$ ./vendor/bin/phpcs -i
- 使用编码标准
$ ./vendor/bin/phpcs --standard=Brianvarskonst path/to/my/file.php
- 可选地,将Brianvarskonst设置为默认编码标准
$ ./vendor/bin/phpcs --config-set default_standard Brianvarskonst
故障排除
如果phpcs
抱怨Brianvarskonst
编码标准未安装,请使用phpcs -i
检查已安装的编码标准,并使用phpcs --config-show
检查installed_paths
是否设置正确
删除或禁用规则
规则树
有时不遵循某些规则是必要的。为了避免错误报告,你可以
- 通过配置删除整个项目的规则。
- 在代码的特定位置禁用规则。
在这两种情况下,都可以删除或禁用
- 一个完整的标准
- 标准子集
- 单个sniff
- 单个规则
这些元素之间存在层次关系:标准
由一个或多个子集
组成,这些子集包含一个或多个嗅探器
,而嗅探器又包含一个或多个规则
。
通过配置文件删除规则
可以使用自定义的phpcs.xml
文件删除整个项目中的规则,例如
<?xml version="1.0"?> <ruleset name="MyProjectCodingStandard"> <rule ref="Brianvarskonst"> <exclude name="PSR1.Classes.ClassDeclaration"/> </rule> </ruleset>
在上面的示例中,已删除了PSR1.Classes.ClassDeclaration
嗅探器(及其包含的所有规则)。
使用PSR1
而不是PSR1.Classes.ClassDeclaration
将删除整个PSR1
标准。而使用PSR1.Classes.ClassDeclaration.MultipleClasses
只会删除这个规则,而不会影响PSR1.Classes.ClassDeclaration
嗅探器中的其他规则。
通过代码注释删除规则
仅针对特定文件或其部分删除规则/嗅探器/子集/标准,可以使用特殊的phpcs
注释。例如,使用// phpcs:disable
后跟可选的标准/子集/嗅探器/规则名称。如下所示
// phpcs:disable PSR1.Classes.ClassDeclaration
有关忽略文件的信息,请参阅官方PHP_CodeSniffer 维基。
IDE 集成
PhpStorm
按照上述说明安装编码标准包后,按照以下步骤配置PhpStorm以使用PHP_CodeSniffer
- 打开PhpStorm设置,并导航到
语言与框架
->PHP
->质量工具
->PHP_CodeSniffer
。
-
在
配置
下拉菜单中,选择本地
。 -
单击下拉菜单旁边的
...
按钮,打开用于指定PHP_CodeSniffer可执行文件路径的对话框。 -
在文件选择对话框中,导航到项目目录中的
vendor/bin/
,并选择phpcs
。在Windows上,选择phpcs.bat
。 -
单击路径输入字段旁边的
验证
按钮。如果一切设置正确,窗口底部将出现一条成功消息。 -
仍然在PhpStorm设置中,导航到
编辑器
->检查
- 在搜索框中输入
codesniffer
,然后选择
PHP
->质量工具
->PHP_CodeSniffer 验证
-
通过勾选相应的复选框并单击
应用
来启用它。 -
选择
PHP_CodeSniffer 验证
,然后单击右侧编码标准
下拉菜单旁边的刷新图标,并选择Brianvarskonst
。- 如果
Brianvarskonst
未列出,请选择自定义
作为标准,并使用下拉菜单旁边的...
按钮指定phpcs.xml
文件。
- 如果
一旦PhpStorm与PHP_CodeSniffer集成,警告和错误将在您的IDE编辑器中自动突出显示。
依赖关系
- PHP CodeSniffer
- David Joos的Symfony编码标准
- PHP_CodeSniffer编码标准的Composer安装程序
- Slevomat编码标准
- PHPCSStandards / PHPCSUtils
贡献
有关信息,请参阅CONTRIBUTING.md。
许可协议
版权所有 (c) 2024, Brianvarskonst,遵循MIT 许可协议