現代のPHP開発において、コードの品質を保つことは非常に重要です。
特に大規模なプロジェクトや長期間にわたる開発では、
効率的なコード管理と品質維持がプロジェクト成功の鍵となります。
この記事では、PHPの静的解析ツールであるPHPStanを活用し、
プロジェクトの品質を向上させる方法について解説します。
具体的には、PHPStanでのカスタムルールの追加方法に焦点を当てます。
これらの技術を駆使することで、PHP開発の効率と品質を同時に高めることができます。
phpstan.neonを用いたPHPStanによる静的解析
カスタムルールを追加する前に、まずはphpstan.neonを用いてPHPStanを動かしましょう。
phpstan.neonは、PHPStanの設定ファイルになります。
では、段階を踏んで説明していきます。
上記のようなプロジェクトがあるとします。
コードの中身は、以下。
test.php
<?php print(1); ?>
このプロジェクトを対象に静的解析をPHPStanで実施します。
インストール方法は、以下の記事で説明しています。
情報は古くなっていますが、やることは同じです。
まずは、Composerを用意します。
そして、プロジェクトルートで次のコマンドを実行。
composer require --dev phpstan/phpstan
実行すると、次のように処理が行われます。
>composer require --dev phpstan/phpstan ./composer.json has been created Running composer update phpstan/phpstan Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking phpstan/phpstan (1.10.60) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing phpstan/phpstan (1.10.60): Extracting archive Generating autoload files 1 package you are using is looking for funding. Use the `composer fund` command to find out more! No security vulnerability advisories found. Using version ^1.10 for phpstan/phpstan
その結果、以下のような構成となります。
とりあえず、PHPStanがインストールされたことを確認しましょう。
> ./vendor/bin/phpstan analyse --version PHPStan - PHP Static Analysis Tool 1.10.60
確認できたら、「phpstan.neon」をプロジェクトルートに作成します。
現時点では、以下のように記述しておきます。
phpstan.neon
parameters: paths: - php level: 0
これで静的解析が開始可能となります。
以下のコマンドで実行できます。
./vendor/bin/phpstan analyse
実行した結果は、以下のようになります。
対象は「php」ディレクトリ以下のファイル(test.php)です。
エラーがない状況と言えます。
PHPStanにおけるカスタムルールの追加
カスタムルールの追加には、以下の作業が必要となります。
- composer.jsonの修正
- カスタムルールの作成
- phpstan.neonの修正
これらを以下で説明します。
composer.jsonの修正
composer.json
{ "require-dev": { "phpstan/phpstan": "^1.10" } }
このファイルを以下のように修正します。
{ "require-dev": { "phpstan/phpstan": "^1.10" }, "autoload": { "psr-4": { "App\\": "src/" } } }
上記の処理がよくわからない場合は、「PSR-4 Autoloader(オートローダー)」で検索してください。
上記修正に合わせて、「src」ディレクトリを作成します。
あと、composer.jsonを修正したので、次のコマンドで反映しておきます。
composer dump-autoload
次のように表示されたら、OK。
> composer dump-autoload Generating autoload files Generated autoload files
カスタムルールの作成
カスタムルールは、PHPでコーディングできます。
ここでは、以下のようなクラスを作成します。
ForbiddenPrintRule.php
<?php namespace App\PHPStan\Rules; use PhpParser\Node; use PhpParser\Node\Expr\Print_; use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; class ForbiddenPrintRule implements Rule { public function getNodeType(): string { return Print_::class; } public function processNode(Node $node, Scope $scope): array { // `print`命令が使われている場合、エラーメッセージを返す return ['Using print function is forbidden.']; } }
カスタムルールの作成には、AST(Abstract Syntax Tree)の知識が必要となります。
しかし、そんなに恐れる必要はありません。
ChatGPTやClaudeを利用すれば、簡単に作成できます。
作成したファイルは、以下のように設置します。
phpstan.neonの修正
phpstan.neonに追加したカスタムルールを追加しましょう。
parameters: paths: - php level: 0 services: - class: App\PHPStan\Rules\ForbiddenPrintRule tags: - phpstan.rules.rule
修正できたら、再度PHPStanによる静的解析を行います。
./vendor/bin/phpstan analyse
そうすると、次のようなエラーが出るはずです。
確かに、test.phpではprint関数を利用しています。
では、それをechoに変更してみましょう。
修正後のtest.php
<?php echo(1); ?>
この状態で、またまたチェックを行います。
エラーがなくなりました。
以上、PHPStanへのカスタムルールの追加方法を説明しました。