phpcsでカスタマイズしたコーディング規約をチェックする
正直なところ、今まであまり厳格に規約に沿ってコーディングしてきませんでした。
- ある程度守っていればいいだろ
- 統一させたいなら整形ツール的なやつで自動化すればいいじゃん
など思っていたんですが、OSSなど作っていきたいと考えた時、ちゃんと標準的なコードを書きたいと思い、コーディング規約をしっかり守りたいと考えるようになりました。
また何が標準かというのを理解するために整形ツールなどではなく、phpcsを使ってコーディング規約をチェックするようにしました。
phpcsインストール
PHP_CodeSnifferをインストールすることでphpcs,phpcbfなどがまるっと使えるようになります。
composer global require "squizlabs/php_codesniffer=*"
ドキュメント通り、composerでさくっとinstall
使い方、規約のルール指定
Usage · squizlabs/PHP_CodeSniffer Wiki · GitHub
phpcs --standard=PSR2 /path/to/file
などで指定したコーディング規約でチェックをすることができます。
規約ルールのカスタマイズ
現在のプロジェクトのコーディング規約はフレームワーク側の兼ね合いもありPSR2をベースにして、一部フレームワーク側の合わせたものになっています。
なので、そのままPSR2を適用すると意図しない規約のチェックが行われるので、PSR2をベースに一部をカスタマイズしたものを作成しました。
vendor/squizlabs/php_codesniffer/CodeSniffer/Standards
以下に各種規約ルールがあります。
ここにカスタマイズした規約ルールを作成し、その規約を指定してphpcsを実行するイメージです。
//MyPSR2という規約ルールを作成する mkdir vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MyPSR2 vi vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MyPSR2/ruleset.xml
今回はPSR2をベースにインデントを4タブ、いくつかのルールを除外したものを作成しました。
exclude nameはphpcs -s
などで実行して除外したいルールを追加していく感じです
ruleset.xml <?xml version="1.0"?> <ruleset name="MyPSR2"> <description>The MyPSR2 coding standard builds on the PSR2 coding standard.</description> <arg name="tab-width" value="4"/> <!-- タブ --> <exclude-pattern>*/Tests/*</exclude-pattern> <!-- Include the whole PSR2 standard except FunctionComment, which we override --> <rule ref="PSR2"> <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/> <rule ref="Generic.WhiteSpace.ScopeIndent"> <properties> <property name="indent" value="4"/> <property name="tabIndent" value="true"/> </properties> </rule> <exclude name="PSR1.Files.SideEffects.FoundWithSymbols"/> <!-- --> <exclude name="PSR2.Methods.FunctionCallSignature.Indent"/> <!-- --> <exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps"/> <!-- --> <exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace"/> <!-- --> <exclude name="Generic.WhiteSpace.DisallowTabIndent.TabsUsed"/> <!-- --> <exclude name="Generic.WhiteSpace.DisallowTabIndent.NonIndentTabsUsed"/> <!-- --> <exclude name="Generic.WhiteSpace.ScopeIndent.Incorrect"/> <!-- --> <exclude name="Squiz.Classes.ValidClassName.NotCamelCaps"/> <!-- --> </rule> </ruleset>
ルール作成後に、
phpcs --standard=MyPSR2 /path/to/file
のように実行すればカスタマイズされたルールで規約のチェックをすることができます。
これでしっかりコーディング規約にそったコードを書いていけますね! 次はいちいちコマンドラインから実行するのもアレなので、エディタからコーディングチェックできるようにしていこうと思います。