正直なところ、今まであまり厳格に規約に沿ってコーディングしてきませんでした。
- ある程度守っていればいいだろ
- 統一させたいなら整形ツール的なやつで自動化すればいいじゃん
など思っていたんですが、OSSなど作っていきたいと考えた時、ちゃんと標準的なコードを書きたいと思い、コーディング規約をしっかり守りたいと考えるようになりました。
また何が標準かというのを理解するために整形ツールなどではなく、phpcsを使ってコーディング規約をチェックするようにしました。
phpcsインストール
PHP_CodeSnifferをインストールすることでphpcs,phpcbfなどがまるっと使えるようになります。
composer global require "squizlabs/php_codesniffer=*"
ドキュメント通り、composerでさくっとinstall
使い方、規約のルール指定
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
などで実行して除外したいルールを追加していく感じです
<?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
のように実行すればカスタマイズされたルールで規約のチェックをすることができます。
これでしっかりコーディング規約にそったコードを書いていけますね!
次はいちいちコマンドラインから実行するのもアレなので、エディタからコーディングチェックできるようにしていこうと思います。