- はじめに
- PSR-12 とは
- PSR-2 と PSR-12 の違い
- PHP_CodeSniffer とは
- IntelliJ / PHPStorm でスタイルチェックする
- Jenkins でコーディングスタイルチェック
- まとめ
はじめに
この記事は PHP アドベントカレンダー 4日目の記事です。
昨日は @taro-hida さんでした。
僕は新卒から5年間ずっとPHPを触っているので、PHPのアドベントカレンダーにはなるべく参加しようと思っています。
PSR-12 とは
PSR-12 とは、 PHP のコーディング規約です。
PHP のコーディング規約には PSR-1 と PSR-12 があり、
- PSR-1 は Basic Coding Standard
- PSR-12 は Extended Coding Style
となっています。
PSR とは、 PHP の規約を集めたもので、 PHP-FIG という団体によって決められています。我々アプリケーション開発者がとくに読んでおくべきものは、PSR-1, PSR-4, PSR-12 あたりです。
PSR-12 の最初に書いてありますが、 PSR-12 は PSR-1 が前提になっています。「コーディング規約は PSR-12 にしよう」と言われたら、 PSR-1 と PSR-12 に従ってコーディングをしていくことになります。
以前は PSR-2 があったのですが、それに変わって新たに PSR-12 が登場し、 PSR-2 は deprecated になっています。
PSR-2 と PSR-12 の違い
PSR-12 では、 PHP 7 系の型宣言に関する規約などが追加されています。
例えば、関数の戻り値の型宣言を書く場合は、 :
の前にはスペースを開けず、 :
の後にはスペースを入れます。型の後ろにもスペースを入れます。
<?php function hoge(): int { ... } function fuga( ... ): int { ... }
新機能に関する規約以外も、いくつか追加されています。例えば、 if の条件式を改行する場合は、論理演算子の前で改行します。これは PSR-2 には無かった規約です。
<?php if ( $expr1 && $expr2 ) { // if body }
PHP_CodeSniffer とは
PHP_CodeSniffer は、 PHP のコーディングスタイルのチェッカーです。
似たようなツールに PHP-CS-Fixer がありますが、こちらは まだ PSR-12 に対応していません。今回は PHP_CodeSniffer を使います。
composer でインストールできます。
composer require --dev squizlabs/php_codesniffer
phpcs.xml
という設定ファイルを用意し、
<?xml version="1.0"?> <ruleset name="PSR12"> <!-- 拡張子が php のものにだけ適用 --> <arg name="extensions" value="php" /> <!-- rule に PSR12 を指定可能 --> <rule ref="PSR12" /> <!-- オプション p:進捗表示 s:エラー表示時にルールを表示 --> <arg value="ps" /> <!-- 対象のファイル、ディレクトリ --> <file>app</file> </ruleset>
phpcs
コマンドでチェックができます。
$ ./vendor/bin/phpcs ...................... 22 / 22 (100%) Time: 371ms; Memory: 10MB
IntelliJ / PHPStorm でスタイルチェックする
わざわざ phpcs コマンドを実行するのは面倒なので、 IntelliJ に設定します。
Preferences
を開き、 Languages & Frameworks
> PHP
> Quality Tools
を開きます。
PHP_CodeSniffer
をトグルを開き、Local
の横にある ...
を押します。
PHP_CodeSniffer path と Path to phpcbf を設定します。PHP_CodeSniffer をインストールしていれば、両方とも vendor/bin 以下にあるはずです。
phpcs はコーディングスタイルのエラーを教えてくれるコマンド、 phpcbf はエラーを修正してくれるコマンドです。
正しく設定できていれば、 Validate ボタンを押した時に、一番下に「OK. PHP_CodeSniffer version ...」と表示されます。
この設定ができていれば、↑のように、コーディングスタイルの誤りがわかります。
Jenkins でコーディングスタイルチェック
ここまでだと、セルフチェックになってしまうので、Jenkins の CI で、 PSR-12 違反があったら落とすようにします。
phpcs コマンドの結果を、 CheckStyle 形式の XML *1 で出力し、 Jenkins の Warning Next Generation
というプラグインで表示してやります。
phpcs の実行コマンドはこのようになります。
./vendor/bin/phpcs --report=checkstyle --report-file=results/phpcs_checkstyle.xml
これを、 Warning Next Generation プラグインに噛ませます。
僕の場合は、 Groovy のスクリプトで Jenkins のジョブを管理しているので、プラグインをインストールした上で以下のようにします。
recordIssues enabledForFailure: true, tool: checkStyle(pattern: 'results/phpcs_checkstyle.xml')
こうすると、 Jenkins 上でこのように表示されます。
具体的にどこがおかしいかも見られます。
Warning Next Generation プラグインの導入は、記事も参考になるかと思います。
まとめ
PSR-12 チェックの導入として、IntelliJ / PHPStorm への導入と、 Jenkins でのチェック方法について説明しました。
PHP での開発の基礎については、以下の記事でも書いていますので、参考にしてください。
明日の担当者は @hgsgtk さんです。
*1:テストの結果を JUnit 形式 XML で出力するようなものです