php-cs-fixerとphp_codesnifferの違いって?

 

サボり気味でした。。。
五月病ですね、気引き締めます。
ネタもちょっと尽きてきた感ありますが、頑張ります!

 

コード整形系のツール

  • php-cs-fixer
  • php_codesniffer

って大変お世話になるんですが、
名前が似すぎて同じものだと思っていました。
なのでちょっと違いを調べてみました。

 

おまけで、

  • phpmd/phpmd
  • phpstan/phpstan-shim

についても、書きました!

 

php-cs-fixer

[friendsofphp/php-cs-fixer]

.php_cs/.php_cs.dist(ルール設定ファイル)に沿って、
PHPコードの修正を提示してくれたり、修正を実行してくれる。

 

(例)配列の書き方はshortに統一することを宣言

.php_cs.dist

...
'array_syntax' => ['syntax' => 'short'],
...

実行結果

// コード修正の提示
$ vendor/bin/php-cs-fixer fix -v --dry-run
Loaded config default from "/Users/XXXX/ticket-hunter-api/.php_cs.dist".
Using cache file ".php_cs.cache".
SSSSSSSFSSSSS
Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error
1) src/test.php (array_syntax)

以下のように、書き直すことで S-Skipped となり解消されます。

-        $arrRet = array();
+        $arrRet = [];

 

 

ただし、実行結果の出力より対象ファイル名は分かりますが、
何行目かなどの詳細はわかりません。
そこで、修正の実行もしてもらう事もできます。「–dry-run」を外すだけです。

$ vendor/bin/php-cs-fixer fix -v --dry-run

 

 

さらに、.php_cs.distでルールを設定する際、
各ルールの具体例みたいなーって時は、以下コマンドで確認できます。

$ vendor/bin/php-cs-fixer describe [name]
$ vendor/bin/php-cs-fixer describe array_syntax
Description of array_syntax rule.
PHP arrays should be declared using the configured syntax.

Fixer is configurable using following option:
* syntax ('long', 'short'): whether to use the `long` or `short` array syntax; defaults to 'long'

Fixing examples:
 * Example #1. Fixing with the default configuration.
   ---------- begin diff ----------
   --- Original
   +++ New
   @@ -1,2 +1,2 @@
    <?php
   -[1,2];
   +array(1,2);

   ----------- end diff -----------

 * Example #2. Fixing with configuration: ['syntax' => 'short'].
   ---------- begin diff ----------
   --- Original
   +++ New
   @@ -1,2 +1,2 @@
    <?php
   -array(1,2);
   +[1,2];

   ----------- end diff -----------

 

 

 

php_codesniffer

[squizlabs/php_codesniffer]

phpcs(PHP Code Sniffer) …判定
phpcbf(PHP Code Beautifier and Fixer) …整形

既定のコーディング標準として用意されているもの(vendor/bin/phpcs -i)をベース
に判定/整形を行う。

phpcs.xml(設定ファイル)にexclude(除外)するものや追加ルールを記載し、カスタマイズすることが可能です。

 

//現在、デフォで適用されているコーディング規約の確認
$ vendor/bin/phpcs -i
The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12

 

例えば、既定のコーディング標準のままだとPEARはfunctionコメントが必須なので、
phpcs.xmlでexcludeする定義を書いたりしてカスタマイズすることができます。

phpcs.xml の例

<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="PHP_CodeSniffer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/squizlabs/php_codesniffer/phpcs.xsd">
 <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter"/>
 <rule ref="PEAR.Commenting.FunctionComment">
 <exclude name="PEAR.Commenting.FunctionComment.MissingReturn"/>
 <exclude name="PEAR.Commenting.FunctionComment.MissingParamComment"/>
 <exclude name="PEAR.Commenting.FunctionComment.SpacingBeforeTags"/>
 <exclude name="PEAR.Commenting.FunctionComment.MissingParamTag"/>
 <exclude name="PEAR.Commenting.FunctionComment.Missing"/>
 <exclude name="PEAR.Commenting.FunctionComment.ParameterCommentsNotAligned"/>
 </rule>
</ruleset>

 

実行方法

$ vendor/bin/phpcs [適用コーディング(--standard=PSR2とか)] [対象ファイル名]
$ vendor/bin/phpcbf [適用コーディング(--standard=PSR2とか)] [対象ファイル名]

 

phpcs.xmlに沿って、src/以下を判定してもらう。

$ vendor/bin/phpcs --standard=phpcs.xml src

FILE: /Users/XXXX/YYY/src/test.php
----------------------------------------------------------------------
FOUND 0 ERRORS AND 2 WARNINGS AFFECTING 1 LINE
----------------------------------------------------------------------
 9 | WARNING | The method parameter $arrString is never used
 9 | WARNING | The method parameter $arrRet is never used
----------------------------------------------------------------------

Time: 57ms; Memory: 6MB

使われていないメソッドの引数があるよーって教えてくれました。

 

phpcbfでフォーマットしてもらう例は以下です。

$ vendor/bin/phpcbf --standard=PEAR src

PHPCBF RESULT SUMMARY
-----------------------------------------------------------------------------
FILE                                                         FIXED  REMAINING
-----------------------------------------------------------------------------
/Users/XXXX/YYY/src/test1.php                                 7      10
/Users/XXXX/YYY/src/test2.php                                 2      5
/Users/XXXX/YYY/src/test3.php                                 2      8
-----------------------------------------------------------------------------
A TOTAL OF 11 ERRORS WERE FIXED IN 3 FILES
-----------------------------------------------------------------------------

 

 

ついでに、、、

phpmd

[phpmd/phpmd]

phpmd.xml(ルール設定ファイル)に沿って、
「ここに使われてない変数あるよ」や、
「コンストラクタ関数が__constractじゃなくてclassnameで宣言されてるやつはダメよ」とか、「ここキャメルケースになってないよ」とかの注意をしてくれる。
若干、phpcsなどとルール設定がかぶる可能性はありそうです。

 

phpmd.xml の例

...
 <!--naming-->
 <rule ref="rulesets/naming.xml/ConstantNamingConventions"/>
 
 <!--unusedcode-->
 <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter"/>
 <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable"/>
 <rule ref="rulesets/unusedcode.xml/UnusedPrivateField"/>
 <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod"/>
 
 <!--controversial-->
 <rule ref="rulesets/controversial.xml/CamelCaseClassName"/>
 <rule ref="rulesets/controversial.xml/CamelCasePropertyName"/>
 <rule ref="rulesets/controversial.xml/CamelCaseMethodName"/>
...

 

実行方法

$ phpmd [file_path] [結果出力フォーマット(text/xml)] [ルール設定ファイル]
$ vendor/bin/phpmd src/TicketHunter.php text phpmd.xml

./Users/XXX/YYY/src/test.php:9 Avoid unused parameters such as '$arrString'
./Users/XXX/YYY/src/test.php:9 Avoid unused parameters such as '$arrRet'

 

 

phpstan

phpstan/phpstan-shim

静的解析ツールで、
– 構文エラーはないか?
– 関数に渡すパラメータの数が適切か?
– 未定義のものにアクセスしようとしていないか?
– 関数に渡す値が関数のパラメータの型宣言と一致するか?
– PHPDocの内容と関数の戻り値は同じか?
などをチェックしてくれます。

除外したいルールがあればphpstan.neonで設定のカスタマイズできるようです。

$ vendor/bin/phpstan analyse -l [レベル] [ファイルパス] -c phpstan.neon

レベルは0~7,maxがあり、レベルが高くなるにつれて厳しくチェックしてくれるとのことです。
またオプションで「–no-progress」を付与すると、進捗を表すバーを非表示にしてくれます。
その他詳細は $ vendor/bin/phpstan analyse -h で確認ができます。

 

$ vendor/bin/phpstan analyse -l max src tests -c phpstan.neon --no-progress
 ------ ----------------------------------
  Line   src/test1.php
 ------ ----------------------------------
  11     Undefined variable: $arrString
 ------ ----------------------------------


 [ERROR] Found 1 errors

参考:https://qiita.com/qiita_masaharu/items/24bf34579119628eefe2

 

 

 

まとめ

各ツールでルール設定が異なっている場合、
(変数名をphpcsではキャメルケース、phpmdではスネークケースを許容している等)
phpcsでは判定が通るけど、phpmdでは判定が通らない
ということが起きかねないなと感じました。
なので、ガチガチにルールを決めちゃうのも
手間がかかるし結構大変だなと思いました。

私はこちらをよく使わせてもらってます。
[Koriym.PhpSkeleton]