SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



PHP_CodeSnifferを使ってPHPのコードを綺麗にしよう

PHP言語はアプリケーション開発の現場で非常に多く使われている、最もポピュラーな言語の一つです。20年近い歴史のあるプログラミング言語であり、その歴史の中で様々なライブラリやフレームワークが開発されてきました。

ライブラリやフレームワークは様々な文化で作られており、変数名やメソッド名の命名規則だけとっても、CamelCaseとlower-caseのどちらもポピュラーな存在です。

例えば、CodeIgniterのStyleGuideではCamelCaseと指定されていますし、FuelPHPのCoding Standardsではlower caseが指定されています。

様々なコードの書き方のバックグラウンドを持つメンバーで1つのプロジェクトを進める場合、コーディングスタンダードを予め定めておくことで、可読性・検索性の高いコードをより保ちやすくなります。

コーディングスタンダードに沿っているかどうかをコードレビューの際に目視で確認するのはとても面倒です。それに代わって、ソースコード解析ツールを使ってチェックすることが出来ます。

PHPには幾つかのソースコード解析ツールがありますが、今回はその一つPHP_CodeSnifferを紹介します。なおSideCIではPHP_CodeSnifferを使ってPHPプロジェクトを解析できます。

PHP_CodeSnifferのインストール

PHP_CodeSnifferはいくつかの方法でインストールできます。Composerを使った場合は次のようにコマンドを打ちます。

$ composer global require "squizlabs/php_codesniffer=*"

このようにインストールすると ~/.composer/vendor/bin/ 以下にインストールされますので、パスを通しておくと良いでしょう。

2つ目としてPearを使った方法があります。

$ pear install PHP_CodeSniffer

このようにインストールすると ~/pear/bin/ 以下にインストールされます。

最後にファイルを直接ダウンロードする方法があります。

$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
php phpcs.phar -h
 
$ curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
php phpcbf.phar -h

実行する際には php phpcs.pharphp phpcbf.phar のようにします。

使い方

基本的には引数としてチェックしたいPHPプロジェクトがあるディレクトリを指定します。コマンドは phpcs です。例えば以下が実行例になります。

$ phpcs .
 
FILE: /path/to/your/code.php
--------------------------------------------------------------------------------------------------
FOUND 61 ERRORS AFFECTING 38 LINES
--------------------------------------------------------------------------------------------------
   2 | ERROR | [ ] Missing file doc comment
   7 | ERROR | [ ] Missing @category tag in class comment
      :
  34 | ERROR | [x] Tag value indented incorrectly; expected 2 spaces but found 1
  35 | ERROR | [ ] Tag cannot be grouped with parameter tags in a doc comment

PHP_CodeSniffer が検出した問題について、そのファイルと行数が一覧になります。さらに問題が検出された実際のコードを確認する場合はオプションに --report=code と指定します。そうすると次のように問題のある箇所をコードで示してくれるようになります。

$ ~/.composer/vendor/bin/phpcs --report=code . | more
 
FILE: /path/to/your/code.php
---------------------------------------------------------------------------------------------------
FOUND 61 ERRORS AFFECTING 38 LINES
---------------------------------------------------------------------------------------------------
LINE   2: ERROR [ ] Missing file doc comment
---------------------------------------------------------------------------------------------------
     1:  <?php
>>   2:   
     3:  namespace·Ncmb;
     4:
---------------------------------------------------------------------------------------------------
LINE   7: ERROR [ ] Missing @category tag in class comment
LINE   7: ERROR [ ] Missing @package tag in class comment
LINE   7: ERROR [ ] Missing @author tag in class comment
LINE   7: ERROR [ ] Missing @license tag in class comment
LINE   7: ERROR [ ] Missing @link tag in class comment
---------------------------------------------------------------------------------------------------
     5:  /**
     6:  ·*·Acl·class
>>   7:  ·*/
     8:  class·Acl·implements·Encodable
     9:  {
---------------------------------------------------------------------------------------------------
LINE  10: ERROR [x] The open comment tag must be the only content on the line
LINE  10: ERROR [ ] Missing short description in doc comment
LINE  10: ERROR [x] The close comment tag must be the only content on the line
:

PHPCBFで一気に綺麗に

一つ一つ手作業で直しても良いのですが、より簡単に直してくれるのが phpcbf コマンドになります。これを実行すると、直すべき点をまとめて変換してくれます。

$ phpcbf .
 
PHPCBF RESULT SUMMARY
---------------------------------------------------------------------------------------------------
FILE                                                                               FIXED  REMAINING
---------------------------------------------------------------------------------------------------
/path/to/your/code.php                                                               23     38

例えばクラスの説明の書き方を直してくれます。

-    /** @var public ACL */
+    /**
+     * @var public ACL 
+    */

引数の渡し方も一行の文字数に基づいて直してくれます。

-        if (strncmp($headers['Content-Type'][0], $validContent,
-                    strlen($validContent)) !== 0) {
+        if (strncmp(
+            $headers['Content-Type'][0], $validContent,
+            strlen($validContent)
+        ) !== 0
+        ) {

ただし残念ながら、PHP_CodeSniffer で検出された全ての問題が自動で修正されるわけではありません。例えばドキュメント用の @author といったタグは自動入力してくれません。そのためエラーは残り続けることになるでしょう。とは言え、ある程度自動で修正してくれれば、すべて手で直すのに比べると大幅に時間の節約になります。なお、自動修正に頼り切ってしまうと、どう書くのが良いのかを学ぶ機会が失われてしまいます。そのため、PHPCBF 実行前後の差分を確認して、次回以降どう書けば良いのかを学ぶのがお勧めです。

PHP_CodeSnifferではデフォルトでPEARのコーディングスタンダードが適用されます。しかしその他にもPSR2、Zend、Generic、Squizから選択できます。スタンダードを追加することも出来、cakephp-codesnifferなど、フレームワークごとに公開されている事があります。自社内で用いているコーディングスタンダードに合わせて選択してください。


SideCIではPHP_CodeSnifferを用いたPHPプロジェクトのコードレビュー自動化に対応しています。ESLintを個々人のPCで使うのも便利ですが、SideCIを利用してGitHub PullRequesetと連携した自動レビューとして、プロジェクトメンバー全員で共通して使う運用がとても便利です。PHP_CodeSnifferをGitHubへのプッシュに連携して自動レビューするようにしたり、複数人での開発時にはSideCIなどのクラウドサービスを利用した運用が便利です。ぜひ活用してください。

squizlabs/PHP_CodeSniffer: PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.