这是我们的自定义php_codesniffer(3.x)嗅探的集合,用于检测潜在的错误和PHP代码中的意外行为。它可以单独用作规则集,但主要旨在作为一组单独的嗅探,可以集成到其他标准中。
我们在博客上描述了其中一些嗅探背后的动机。
使用作曲家作为开发依赖性安装:
$ 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引起的无声错误,因为PHP将switch视为循环结构。
moxiosniffs.php.disallowimplicliclicloosecomecomparison :通过诸如in_array和array_search类的函数删除隐式非图案比较。要求明确设置这些功能的$strict参数。由于非图案比较的违反直觉行为,这防止了隐藏的错误。
moxiosniffs.php.disallowimpliclicosebase64decode :删除base64_decode函数的隐式非图案用法。要求明确设置此功能的$strict参数。
moxiosniffs.php.disallowuniqidwithoutmoreentropy :在没有$more_entropy = true情况下将呼叫拨打到uniqid() 。当$more_entropy为false (默认值)时, uniqid()调用usleep()以避免碰撞,这可能是实质性的命中。始终使用$more_entropy = true调用uniqid()避免这些问题。
moxiosniffs.php.dislolyarraycombinerswithsinglearray :取消对功能的调用,这些函数将两个或多个数组组合在一起,仅给出一个作为参数的单个数组。这适用于诸如array_merge(_recursive) , array_replace(_recursive)和array_diff和array_intersect的所有变体之类的功能。这样的呼叫没有意义,很可能是逗号或括号放错位的结果。要重新索引单个数组,只需使用array_values即可。
moxiosniffs.php.disallowimpliticmicrotimeassstring :在没有明确设置$get_as_float参数的情况下,请拨打microtime()的呼叫。默认情况下, microtime具有一个字符串作为其返回值(“ MSEC SEC”),这是出乎意料的,不能天真地施放到浮动中,从而使其容易出错。仍然可以将此参数设置为false ,但是在这种情况下,您可能已经考虑过。
moxiosniffs.php.disallowimpliciteratoratoarraywithusekeys :在没有明确设置的$use_keys参数的情况下,请拨打iterator_to_array()的呼叫。默认情况下, iterator_to_array使用迭代器提供的键。这种行为通常需要用于关联数组,但可能会导致“列表状”数组的意外结果。明确要求设置参数确保开发人员必须考虑到手头情况需要哪种行为。
moxiosniffs.php.disallowdatetime :删除DateTime的用法,而是促进DateTimeImmutable的使用。前者可变可导致一些微妙但讨厌的虫子。有关为什么您要使用DateTime劝阻为什么要劝阻的更多背景。
moxiosniffs.php.disallowmbdetectencecoding :删除mb_detect_encoding的用法。此功能具有误导性名称,这意味着它实际上可以检测到字符串的编码,这通常是不可能的。相反,它会检查一个编码列表,直到找到可能是正确的编码(即按照该编码为有效的字节序列)。使用mb_check_encoding (可能在循环中)可以更明确。有关此主题的更多背景信息,请参见此谈话。
moxiosniffs.php.dislolyutf8encodecode :删除对utf8_encode()和utf8_decode()的呼叫。这些功能可以被视为误导性,因为它们仅转换为ISO-8859-1,并且不会“神奇地”检测源/目标编码。使用iconv()或mb_convert_encoding()将两个字符编码在转换中发挥作用。
MoxioSniffs.PHP.DisallowDateCreateFromFormatWithUnspecifiedTimeComponent : Disallows calls to DateTime::createFromFormat , DateTimeImmutable::createFromFormat , date_create_from_format & date_create_immutable_from_format with formats which do not specify a time component and do not initialize fields to null.否则,这将创建设置为当前(创建)时间的时间组件的DateTime(不变)对象,这可能永远不是您想要的,并且可以成为错误的来源。
在使用作曲家安装依赖项(包括开发依赖项)之后,运行
$ ./vendor/bin/phpunit
从项目根目录中。
该项目遵守语义版本。
请注意,从该库的角度来看,作为嗅探的挑选和匹配集合(而不是完整的编码标准),新嗅探的添加将不被视为破坏的变化,因此不会导致主要版本编号的增加。
这些嗅探是根据MIT许可发布的。