猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

【PHP】PSR-12 のチェックを PHP_CodeSniffer で行う

はじめに

この記事は PHP アドベントカレンダー 4日目の記事です。

qiita.com

昨日は @taro-hida さんでした。

qiita.com

僕は新卒から5年間ずっとPHPを触っているので、PHPのアドベントカレンダーにはなるべく参加しようと思っています。

f:id:yoshiki_utakata:20201203223534p:plain

PSR-12 とは

PSR-12 とは、 PHP のコーディング規約です。

PHP のコーディング規約には PSR-1 と PSR-12 があり、

となっています。

f:id:yoshiki_utakata:20201203223203p:plain

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 のコーディングスタイルのチェッカーです。

github.com

似たようなツールに PHP-CS-Fixer がありますが、こちらは まだ PSR-12 に対応していません。今回は PHP_CodeSniffer を使います。

github.com

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 に設定します。

f:id:yoshiki_utakata:20201203225138p:plain

Preferences を開き、 Languages & Frameworks > PHP > Quality Tools を開きます。

PHP_CodeSniffer をトグルを開き、Local の横にある ... を押します。

f:id:yoshiki_utakata:20201203225315p:plain

PHP_CodeSniffer path と Path to phpcbf を設定します。PHP_CodeSniffer をインストールしていれば、両方とも vendor/bin 以下にあるはずです。

phpcs はコーディングスタイルのエラーを教えてくれるコマンド、 phpcbf はエラーを修正してくれるコマンドです。

正しく設定できていれば、 Validate ボタンを押した時に、一番下に「OK. PHP_CodeSniffer version ...」と表示されます。

f:id:yoshiki_utakata:20201204151931p:plain

この設定ができていれば、↑のように、コーディングスタイルの誤りがわかります。

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 プラグインに噛ませます。

plugins.jenkins.io

僕の場合は、 Groovy のスクリプトで Jenkins のジョブを管理しているので、プラグインをインストールした上で以下のようにします。

recordIssues enabledForFailure: true, tool: checkStyle(pattern: 'results/phpcs_checkstyle.xml')

こうすると、 Jenkins 上でこのように表示されます。

f:id:yoshiki_utakata:20201203230413p:plain

具体的にどこがおかしいかも見られます。

f:id:yoshiki_utakata:20201203230425p:plain

Warning Next Generation プラグインの導入は、記事も参考になるかと思います。

rikupapa-shima.hatenablog.com

まとめ

PSR-12 チェックの導入として、IntelliJ / PHPStorm への導入と、 Jenkins でのチェック方法について説明しました。

PHP での開発の基礎については、以下の記事でも書いていますので、参考にしてください。

www.utakata.work

明日の担当者は @hgsgtk さんです。

qiita.com

*1:テストの結果を JUnit 形式 XML で出力するようなものです