こんにちは。よっしーです(^^)
今日は、dockerで構築した開発環境において、phpstanを導入した手順をご紹介します。
実行環境
この記事は、特定の開発環境を前提として書かれています。もし興味がある場合は、その開発環境を構築するための説明が書かれている記事を参考にしてください。該当記事は下記になります。
ただ、この記事で紹介している修正内容がたくさんあるので、その修正を反映した最新版のプログラムをダウンロードして、参照することをおすすめします。該当のプログラムの詳細については、下記のページで確認できます。
背景
PHPstanは、静的解析ツールの1つであり、PHPのコードベースに対して静的解析を行い、タイプヒントの不一致や未定義のプロパティやメソッドなどのエラーを検出することができます。
そのため、Phanと同様にPHPstanを導入する背景には、以下のような理由が挙げられます。
- コード品質の向上:静的解析により、コードベースの品質を向上することができます。エラーを事前に検出することで、バグの発生を減らすことができます。
- リファクタリングの支援:コードベースのリファクタリング時に、変数名やメソッド名の変更がコード全体に影響を与えることがあるため、静的解析により、変更に伴う影響を事前に検出することができます。
- ドキュメントの生成:静的解析により、コードのドキュメントを自動生成することができます。また、コードの可読性も向上します。
- CI/CDパイプラインの自動化:PHPstanは、CI/CDパイプラインで自動的に実行できるため、コード品質の自動化に役立ちます。
以上のような理由から、PHPstanの導入は、PHPのコードベースの品質を向上させるために有用だと考えられます。
ディレクトリ構造
ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。
.
├── LICENSE
├── Makefile
├── README.md
└── app
├── apache-exporter
├── compose.yml
├── flyway
├── grafana
├── influxdb
├── k6
├── memcached
├── memcached-exporter
├── nginx
├── nginx-exporter
├── phan
├── php-fpm
├── php-fpm-exporter
├── phpstan
│ ├── .gitignore
│ ├── Dockerfile
│ ├── phpstan.neon
│ └── log
│ └── .gitkeep
├── mongo
├── mysql
├── mysqld-exporter
├── prometheus
├── redis
├── redis-exporter
├── schemaspy
├── web
└── xhgui
compose.yml
下記の内容をファイル(compose.yml) 318-326 行目に追加します。
phpstan-cmd:
build: ./phpstan
container_name: phpstan
volumes:
- ./php-fpm/CodeIgniter-3.1.13/application:/app/src
- ./phpstan/phpstan.neon:/app/phpstan.neon
profiles:
- phpstan
phpstan/Dockerfile
下記の内容で新規ファイル(phpstan/Dockerfile) を作成します。
FROM phpstan/phpstan:latest
phpstan/phpstan.neon
下記の内容で新規ファイル(phpstan/phpstan.neon) を作成します。
parameters:
level: 0
paths:
- %currentWorkingDirectory%/src
phpstan/log/.gitkeep
空で新規ファイル(phpstan/log/.gitkeep) を作成します。
Makefile
下記の内容をファイル(Makefile) 72-77 行目に追加します。
# 静的解析の実施
.PHONY: run_phpstan
run_phpstan:
cd $(WOKR_DIR) \
&& docker compose run --rm phpstan-cmd > ./phpstan/log/analysis_$(RUN_DATETIME).log
動作確認
下記のコマンドを実行して、サービスを起動します。
make run_phpstan
下記のファイルができていることを確認します。
app/phpstan/log/analysis_(実行日時).log
ただ、makeコマンドを実行すると下記のようにエラーが表示されますが、原因解明には至っていないです。気になる方は、docker compose コマンドを実行してもらえればと思います。makeコマンドで実行した結果とdocker compose コマンドで実行した結果は同じでした。
% make run_phan
cd ./app \
&& docker compose run --rm phpstan-cmd > ./phpstan/log/analysis_20230430_231212.log
analyze
make: *** [run_phan] Error 1
解説
phpstanについて
PHPstanは、PHPの静的解析ツールの1つです。PHPのコードベースに対して静的解析を行い、タイプヒントの不一致や未定義のプロパティやメソッドなどのエラーを検出することができます。
PHPstanは、コマンドラインツールとして実行され、コードベースを解析して、検出した問題をレポートします。PHPのバージョン7.1以上をサポートしており、PSR-4やComposerなどの一般的なPHPのツールやフレームワークとも互換性があります。
PHPstanは、さまざまな機能を提供しています。例えば、次のような機能があります。
- 継承元のクラスから継承されたメソッドの実装の不一致を検出する機能
- インターフェイスを実装していないクラスの検出
- メソッドや関数の引数や戻り値の型の不一致の検出
- プロパティやメソッドの存在しない変数の参照の検出
PHPstanは、PHPのコード品質を向上するために役立ちます。エラーを事前に検出することで、バグの発生を減らし、コードの品質を向上させることができます。また、ドキュメントの生成やCI/CDパイプラインの自動化にも役立ちます。
phpstan/phpstan.neon
parameters:
level: 0
paths:
- %currentWorkingDirectory%/src
この設定ファイルでは、parameters
キーを持つ配列が定義されており、その中にlevel
とpaths
という2つのキーを持つ連想配列が定義されています。
level
キーは、値が0
に設定されています。この値は、phpstan
というPHPの静的解析ツールの設定ファイルで使用されるものであり、0
は、エラーの検出レベルが最小であることを示しています。paths
キーは、値が配列で設定されています。この値は、phpstan
の解析対象とするパスを定義しており、%currentWorkingDirectory%/src
は、カレントディレクトリのsrc
ディレクトリを解析対象とすることを意味しています。
つまり、この設定ファイルでは、phpstan
を使用して、カレントディレクトリのsrc
ディレクトリを最小限のエラー検出レベルで解析することが設定されています。
おわりに
今日は、dockerで構築した開発環境にphpstanを導入しました。ぜひ、品質向上等に使用してみてください。
今回使用したファイルは下記のGitHubにタグ付けしています。
もし、質問等あればコメントください。確認後、ご連絡いたします。随時、エンジニア案件も相談可能ですので、よろしくお願いいたします。
また明日お会いしましょう!
コメント