這是我們的自定義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許可發布的。