PHPエンジニアのためのPHPStanガイド~知っておくべきポイント~
目次[非表示]
- 1.はじめに
- 2.静的解析とは
- 3.PHP Stanとは
- 4.PHP Stan実践
- 4.1.PHP Stanのインストール
- 4.2.設定方法
- 4.3.PHP Stan実行
- 4.4.ルールレベル
- 4.5.エラーを無視する方法
- 5.実際に使ってみた感触
- 6.まとめ
- 6.0.1.お悩みご相談ください
はじめに
こんにちは、株式会社divxでエンジニアをしている今度です。
現在、PHPを使用したWebアプリケーションの保守・運用プロジェクトに携わっています。
このプロジェクトでPHP Stan(PHP Static Analysis Tool) を導入しました。
今回は、PHPの静的解析ツールであるPHP Stanについて簡単に説明していきたいと思います。
静的解析ツールを導入していないプロジェクトに携わっているエンジニアの方やPHP Stanに興味があるエンジニアの方へ参考になれば幸いです。
静的解析とは
静的解析とは、ソフトウェアのソースコードを実行せずに解析する手法です。
以下に静的解析の目的を挙げます。
- バグの早期発見
- コーディングの段階で潜在的なバグを発見することで、後のテストや運用段階での問題発生を減少させる
- コード品質の向上
- コードが一貫していて、読みやすく、保守しやすいかどうかを確認する
- セキュリティの強化
- 潜在的なセキュリティ脆弱性を検出する
- 標準遵守
- コードが指定されたコーディング標準やベストプラクティスに従っているかチェックする
静的解析には様々なツールが存在しています。
その中でも今回はPHP Stanについて掘り下げていきます。
PHP Stanとは
まずPHP Stanとは、PHPコードの静的解析を行うツールになります。
PHPコードを実行せずにコードベース全体を解析し、型や構造に関する問題を指摘します。
これによりアプリケーションを実行した時にはじめて気づくような問題を未然に察知することができます。
- PHP Stan 公式:https://phpstan.org/user-guide/getting-started
- PHP Stan GitHub:https://github.com/phpstan/phpstan
PHP Stan実践
PHP Stanのインストール
PHP Stanのダウンロードには PHP 7.2以降 が必要となりますので、ご注意ください。
PHP Stanは Composer パッケージとして公開されているので、composerコマンドでインストールすることができます。
下記のようにコマンドを実行すれば PHP Stanがインストールされ、phpstanコマンドが利用できるようになります。
ちなみに、PHP Stanには公式のDockerファイルも用意されています。
Composerを利用していないプロジェクトやプロジェクトのcomposer.jsonにPHP Stanを導入したくない場合などに利用できます。
DockerでPHP Stanを使用する場合は、こちらを参照してください。
設定方法
プロジェクトのルートディレクトリでphpstan.neon というファイル名で設定ファイルを作成します。
設定ファイルは下記のようになります。
- paths: 解析対象のコードディレクトリを指定します。ここではapp/srcを指定しています。
- level:適用するルールレベルを指定します。ここでは最も緩い「0」を指定しています。
PHP Stan実行
PHP Stanを実行するには、phpstan コマンドを利用します。
またanalyse サブコマンドで、適切なディレクトリを指定すると設定ファイルの内容に従って静的解析を行い、エラーを出力します。
例えば、app/srcディレクトリを解析したい場合は、以下のコマンドを実行します。
このコマンドは、app/src内のPHPファイルを解析し、問題があれば表示します。
エラーが検出された場合は、下記のような出力になります。
エラーが検出されたファイル名、行番号、エラー内容を示すメッセージが出力されます。
Line |
src/Example.php |
23 |
Call to an undefined method Example::nonExistentMethod(). |
ここでは、src/Example.phpの23行目で、未定義のメソッドを呼び出しているため警告が表示されています。
このようにPHPコードを実行せずにコードの問題点を検出することができます。
ルールレベル
PHP Stanには現在10レベル(0が最も緩く、9が最も厳密)用意されており、必要に応じてレベルを選択することができます。
この機能により、PHP Stanチェックを段階的に導入できるようになります。
低いルールレベルで使い始めて、必要に応じてレベルを上げることができます。
ルールレベル |
|
---|---|
0 |
基本的なチェック、不明なクラス、不明な関数、不明なメソッドの呼び出し、それらのメソッドと関数に渡される引数の数が間違っている、未定義の変数 |
1 |
未定義の変数、未知のマジックメソッド、およびクラス上のプロパティ |
2 |
メソッドのすべての式のチェック、PHPDocsの検証 |
3 |
戻り値の型、プロパティに割り当てられた型 |
4 |
基本的なデッドコード チェック |
5 |
メソッドや関数に渡される引数の型を確認 |
6 |
不足しているタイプヒントを報告 |
7 |
部分的に間違ったユニオン型を報告、その他の誤りの可能性 |
8 |
メソッドの呼び出しとnull許容型のプロパティへのアクセスの報告 |
9 |
型について厳格に確認 |
例えばレベル5を実行すると、レベル0~4のすべてのチェックも実行される仕様です。
エラーを無視する方法
あるレベルで検出されたエラーを今時点では修正が難しいなどのさまざまな理由によりPHP Stan
によって検出されたいくつかのエラーを無視したい場合が出てくると思います。
そのような場合は、baselineファイルを作成して、エラーを無視するようにします。
baselineファイルの生成には、php stanコマンドの--generate-baselineオプションを利用します。
下記のように実行すると、phpstan-baseline.neonというファイルに無視するエラーが記録されていきます。
生成されたphpstan-baseline.neonは下記のようになります。
ignoreErrorsキーに無視するエラーメッセージ、ファイル名、回数が記述されます。
設定方法で作成したphpstan.neonファイルに、このファイルを読み込むように指定します。
下記のように追加することでphpstan-baseline.neonファイルを読み込み、エラーを無視できる
ようになります。
※エラーを無視しても、最終的にエラーを解決する必要があります。
実際に使ってみた感触
- 導入のしやすさ
- 手順も少なく、すぐに導入することができる
- 柔軟に対応可能
- 状況に応じて、ルールレベルや実行範囲を変更することができる
- 早期発見
- コードの実行前に静的解析を行うため、バグやエラーを早期に発見できる
- コード品質向上
- コードの可読性や保守性を向上させることができる
まとめ
今回は、静的解析ツールであるPHP Stanについて書かせていただきました。
PHP Stanは導入もしやすく、エラーやバグの早期発見ができるなど多くのメリットがあります。
またルールレベルを簡単に変更することができるため、柔軟にかつ段階的に導入することができます。
実際にプロジェクトではレベル0から始めましたが、このレベルでも多くのエラーやバグを発見し
てくれたので十分に導入する効果はあると感じました。
ぜひ、導入されてみてはいかがでしょうか!