moxio / php-codesniffer-sniffs
PHP_CodeSniffer 的自定义嗅探器
Requires
- php: ^7.1 || ^8.0
- slevomat/coding-standard: ^6.0 || ^7.0 || ^8.0 <= 8.15.0
- squizlabs/php_codesniffer: ^3.0.0
Requires (Dev)
- phpunit/phpunit: ^8.5.12
This package is auto-updated.
Last update: 2024-09-26 15:17:37 UTC
README
Moxio PHP_CodeSniffer 嗅探器
这是我们针对 PHP_Codesniffer (3.x) 的自定义嗅探器的集合,用于检测 PHP 代码中的潜在错误和意外行为。它可以作为一个规则集独立使用,但主要目的是作为一个可以集成到其他标准中的独立嗅探器集。
我们在博客中描述了这些嗅探器的动机 [链接]。
安装和使用
使用 composer 安装为开发依赖项
$ composer require --dev moxio/php-codesniffer-sniffs
将您的文件与这组嗅探器进行比对
$ ./vendor/bin/phpcs --standard=vendor/moxio/php-codesniffer-sniffs/MoxioSniffs path/to/your/files
嗅探器描述
很快将添加更多嗅探器。
MoxioSniffs.PHP.DisallowBareContinueInSwitch: 禁止在 switch
-case
中直接使用不带数字参数的 continue
语句。这防止了 PHP 将 switch
视为循环结构而导致的静默错误。
MoxioSniffs.PHP.DisallowImplicitLooseComparison: 禁止使用如 in_array
和 array_search
等函数进行隐式非严格比较。要求显式设置这些函数的 $strict
参数。这防止了由于 非严格比较的非直观行为 而导致的隐藏错误。
MoxioSniffs.PHP.DisallowImplicitLooseBase64Decode: 禁止隐式非严格使用 base64_decode
函数。要求显式设置该函数的 $strict
参数。
MoxioSniffs.PHP.DisallowUniqidWithoutMoreEntropy: 禁止在 uniqid()
中不使用 $more_entropy = true
。当 $more_entropy
为 false
(默认值)时,uniqid()
调用 usleep()
以避免冲突,这可能会对性能产生重大影响。始终使用 $more_entropy = true
调用 uniqid()
可以避免这些问题。
MoxioSniffs.PHP.DisallowArrayCombinersWithSingleArray: 禁止调用仅提供单个数组作为参数的函数来组合两个或更多数组。这适用于 array_merge(_recursive)
、array_replace(_recursive)
和所有变体的 array_diff
和 array_intersect
函数。这种调用没有意义,很可能是由于逗号或括号的误放。要重新索引单个数组,请使用 array_values
。
MoxioSniffs.PHP.DisallowImplicitMicrotimeAsString: 禁止不显式设置 $get_as_float
参数的情况下调用 microtime()
。默认情况下,microtime
返回一个字符串值 ("msec sec"),这是意外的,并且无法简单地转换为浮点数,这使得它容易出错。仍然可以将此参数设置为 false
,但在此情况下,您可能已经考虑过这一点。
MoxioSniffs.PHP.DisallowImplicitIteratorToArrayWithUseKeys: 禁止不显式设置 $use_keys
参数的情况下调用 iterator_to_array()
。默认情况下,iterator_to_array
使用迭代器提供的键。这种行为对于关联数组通常是有用的,但可能导致 'list-like' 数组的 意外结果。显式要求设置参数确保开发人员必须考虑针对当前情况需要哪种行为。
MoxioSniffs.PHP.DisallowDateTime:禁止使用 \DateTime
并推荐使用 \DateTimeImmutable
。前者是可变的,可能导致一些微妙但讨厌的错误。请参阅这篇文章了解为什么不推荐使用 \DateTime
的更多背景信息。
MoxioSniffs.PHP.DisallowMbDetectEncoding:禁止使用 mb_detect_encoding
。这个函数的名字具有误导性,给人一种它可以实际检测字符串编码的错觉,这是一个通常不可能的问题。实际上,它检查一系列编码,直到找到一个可能正确的编码(即字符串是按照该编码的有效字节序列)。使用 mb_check_encoding
(可能在一个循环中)可以使这个操作更加明确。请参阅这个演讲了解有关此主题的更多背景信息。
MoxioSniffs.PHP.DisallowUtf8EncodeDecode:禁止调用 utf8_encode()
和 utf8_decode()
。这些函数可以被认为具有误导性,因为它们只转换到/从 ISO-8859-1,并不“神奇地”检测源/目标编码。使用 iconv()
或 mb_convert_encoding()
可以使转换中涉及的字符编码更明确。
MoxioSniffs.PHP.DisallowDateCreateFromFormatWithUnspecifiedTimeComponent:禁止调用 \DateTime::createFromFormat
、\DateTimeImmutable::createFromFormat
、date_create_from_format
和 date_create_immutable_from_format
,格式没有指定时间组件且未将字段初始化为 null。否则,将创建 DateTime(Immutable) 对象,其时间组件设置为当前(创建)时间,这通常不是你想要的,也可能成为错误源。
运行测试
使用 Composer 安装依赖关系(包括开发依赖关系)后,请从项目根目录运行
$ ./vendor/bin/phpunit
。
版本控制
本项目遵循 语义版本控制。
请注意,从本库作为一个嗅探(sniffs)的挑选和匹配集合的角度来看(而不是一个完整的编码标准),新嗅探的添加不会被视为重大变更,因此不会导致主版本号增加。
许可证
这些嗅探程序在 MIT 许可证下发布。