PintとPHPStan、入れてる? PHPコードの品質を自動で守る2つのツールの使い分け

目次

「動くけど汚いコード」と「動くけどバグが潜んでるコード」

PRレビューで「インデントがずれてます」「ここ未定義の変数使ってませんか?」という指摘、していませんか? あるいはされていませんか? こういった指摘は、人間がやるべき仕事ではありません。ツールに任せれば、レビューはロジックや設計の議論に集中できます。

PHPの世界でこれを実現するのがPint(コードフォーマッター)PHPStan(静的解析ツール)の2つです。役割はまったく違いますが、セットで入れることでコード品質を自動的に守れます。本記事では、それぞれの役割、セットアップ、CI/CDへの組み込みまでを解説します。

Pintとは? ― コードの「見た目」を自動で揃える

Pint(Laravel Pint公式ドキュメント)は、Laravel公式のコードフォーマッターです。内部的にはPHP-CS-Fixerを使っており、コードのインデント、スペース、改行、use文の並び順などを自動で統一してくれます。

やってくれることを一言でいうと、「見た目を揃える」。ロジックには一切触れず、フォーマットだけを修正します。

// ❌ Before: インデントやスペースがバラバラ
function calcTotal( $price,$tax ){
    return $price*( 1+$tax );
}

// ✅ After: Pintが自動整形
function calcTotal($price, $tax)
{
    return $price * (1 + $tax);
}

JavaScript/TypeScriptでいうPrettier、Pythonでいうblackと同じポジションです。

PHPStanとは? ― コードの「中身」のバグを見つける

PHPStan(PHPStan公式サイト)は、PHPの静的解析ツールです。コードを実行せずにソースコードを解析し、型の不一致、未定義の変数やメソッド呼び出し、到達しないコードなどのバグを検出します。

やってくれることを一言でいうと、「実行前にバグを見つける」。TypeScriptの型チェックに近い感覚です。

// PHPStanが検出するエラーの例

// ❌ 未定義の変数
function getTotal(): int
{
    return $price * 1.1;  // PHPStan: Variable $price might not be defined.
}

// ❌ 型の不一致
function greet(string $name): string
{
    return 123;  // PHPStan: Method greet() should return string but returns int.
}

// ❌ 存在しないメソッド呼び出し
$user->getFullname();  // PHPStan: Call to an undefined method User::getFullname().
                       // (正しくは getFullName())

PHPは動的型付け言語なので、こうしたバグは実行するまで分かりません。PHPStanを入れることで、テストを書かなくても型レベルのバグを事前に検出できます。

役割の違いを整理する

項目 Pint PHPStan
役割 コードの見た目を揃える コードのバグを見つける
チェック対象 インデント、スペース、改行、use文の順序 型の不一致、未定義変数、到達不能コード
コードを修正するか ✅ 自動修正する ❌ 指摘のみ(修正は人間)
ロジックに影響するか しない しない(解析のみ)
JS/TSで近いツール Prettier TypeScriptコンパイラ / ESLint
必要な設定 ほぼゼロコンフィグ 解析レベル(0〜9)を選ぶ

Pintは「見た目」、PHPStanは「中身」。対象がまったく違うので競合しません。両方入れて初めて「フォーマット+バグ検出」のカバレッジが揃います。

セットアップと基本コマンド

Pint

Laravel 10以降にはPintが標準搭載されています。それ以外のプロジェクトはComposerでインストール。

# インストール(Laravel以外の場合)
composer require laravel/pint --dev

# フォーマットを実行(自動修正)
./vendor/bin/pint

# チェックだけ(修正しない。CIで使う)
./vendor/bin/pint --test

デフォルトでLaravelのコーディングスタイルが適用されます。カスタマイズしたい場合は、プロジェクトルートにpint.jsonを置きます。

// pint.json(カスタマイズ例)
{
    "preset": "laravel",
    "rules": {
        "concat_space": {
            "spacing": "one"
        }
    }
}

PHPStan

# インストール
composer require phpstan/phpstan --dev

# Laravelプロジェクトなら拡張も入れる
composer require larastan/larastan --dev

# 解析を実行
./vendor/bin/phpstan analyse

プロジェクトルートにphpstan.neonを置いて設定します。

# phpstan.neon
includes:
    - vendor/larastan/larastan/extension.neon  # Laravelの場合

parameters:
    paths:
        - app
    level: 5  # 0(ゆるい)〜 9(最も厳しい)

levelは最初は5から始めるのがおすすめ。0だとほとんど何も検出されず、9だと既存プロジェクトではエラーが大量に出て心が折れます。5で現実的なバグを拾いつつ、徐々にレベルを上げていく運用が安定します。

CI/CDに組み込んで自動化する

ローカルで実行するだけだと忘れるので、GitHub Actionsに組み込みましょう。

# .github/workflows/code-quality.yml
name: Code Quality
on: [pull_request]

jobs:
  pint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - uses: shivammathur/setup-php@9e72090525849c5e82e596468f6d9ad0ec5c169a # v2
        with:
          php-version: '8.3'
      - run: composer install --no-interaction
      - run: ./vendor/bin/pint --test

  phpstan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - uses: shivammathur/setup-php@9e72090525849c5e82e596468f6d9ad0ec5c169a # v2
        with:
          php-version: '8.3'
      - run: composer install --no-interaction
      - run: ./vendor/bin/phpstan analyse

PRごとにPintのフォーマットチェックとPHPStanの解析が自動で走ります。ブランチ保護ルールと組み合わせれば、チェックを通過しないとマージできない仕組みが作れます。

PHPの開発品質を高める関連記事

まとめ:Pintで見た目を揃え、PHPStanでバグを潰す

  • Pintはコードフォーマッター。インデント・スペース・use文の順序を自動修正する
  • PHPStanは静的解析ツール。型の不一致や未定義変数をコード実行前に検出する
  • 役割が違うので両方入れる。Pintは「見た目」、PHPStanは「中身」
  • PHPStanのlevelは5から。徐々に上げていくのが現実的
  • GitHub Actionsに組み込んで自動化。PRごとにチェックが走る仕組みにする

レビューで「インデントがずれてます」「この変数未定義では?」という指摘をしている時間は、本来ロジックや設計の議論に使うべき時間です。PintとPHPStanを入れれば、その手の指摘はツールが勝手にやってくれる。人間は人間にしかできないレビューに集中しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次