読者です 読者をやめる 読者になる 読者になる

恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

phpcsでカスタマイズしたコーディング規約をチェックする

php phpcs

正直なところ、今まであまり厳格に規約に沿ってコーディングしてきませんでした。

  • ある程度守っていればいいだろ
  • 統一させたいなら整形ツール的なやつで自動化すればいいじゃん

など思っていたんですが、OSSなど作っていきたいと考えた時、ちゃんと標準的なコードを書きたいと思い、コーディング規約をしっかり守りたいと考えるようになりました。

また何が標準かというのを理解するために整形ツールなどではなく、phpcsを使ってコーディング規約をチェックするようにしました。

phpcsインストール

github.com

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 のように実行すればカスタマイズされたルールで規約のチェックをすることができます。

f:id:ogataka50:20160705182312p:plain

これでしっかりコーディング規約にそったコードを書いていけますね! 次はいちいちコマンドラインから実行するのもアレなので、エディタからコーディングチェックできるようにしていこうと思います。