「動くけど汚いコード」と「動くけどバグが潜んでるコード」
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 analysePRごとにPintのフォーマットチェックとPHPStanの解析が自動で走ります。ブランチ保護ルールと組み合わせれば、チェックを通過しないとマージできない仕組みが作れます。
PHPの開発品質を高める関連記事
- 「それ、上げちゃダメ!」GitHub管理で絶対守るべきセキュリティルールと対処法 – CIでのコード品質チェックとGitHubのブランチ保護設定
- GitHub Actionsのサプライチェーン攻撃を防ぐ!アクションをコミットハッシュで固定する方法 – CI/CDのワークフロー自体のセキュリティ対策
- Claude Codeとは?AI搭載のコーディングアシスタントを徹底解説 – PHPStanのエラー修正やPintの設定調整をAIに相談する活用法
- コマンドラインの基本と活用方法【初心者エンジニア向け】 – ComposerやPint/PHPStanのコマンド実行に必要なCLI基本操作
- リリース前に必ず確認!バイブコーディング&非エンジニア向けWebアプリ安全チェックリスト – テスト・静的解析を含むリリース前のチェック全般
まとめ:Pintで見た目を揃え、PHPStanでバグを潰す
- Pintはコードフォーマッター。インデント・スペース・use文の順序を自動修正する
- PHPStanは静的解析ツール。型の不一致や未定義変数をコード実行前に検出する
- 役割が違うので両方入れる。Pintは「見た目」、PHPStanは「中身」
- PHPStanのlevelは5から。徐々に上げていくのが現実的
- GitHub Actionsに組み込んで自動化。PRごとにチェックが走る仕組みにする
レビューで「インデントがずれてます」「この変数未定義では?」という指摘をしている時間は、本来ロジックや設計の議論に使うべき時間です。PintとPHPStanを入れれば、その手の指摘はツールが勝手にやってくれる。人間は人間にしかできないレビューに集中しましょう。
