「静的解析に意味なんかあるのか?」
こんなふうに思っていませんか?
正直、私はそう思っていました。
テストで実際に動いているし、それで十分だろうと。
また、静的解析をすることが開発に余計な負担を与えるのは違います。
あくまで、メインは開発(テスト込み)です。
だから、開発に余計な負担を与えてまで静的解析をする必要などはありません。
しかし、それが簡単にできてしまうのです。
PHPStanを使えば、開発に無駄な負担をかけることは一切ありません。
本記事の内容
- 静的解析とは?
- PHPStanのインストール
- PHPStanで実際のプロジェクトを静的解析
それでは、上記に沿って解説していきます。
静的解析とは?
PHPStanは、静的解析ツールです。
静的があれば、動的も存在します。
動的解析とは、実際にプログラムを動かして行う解析のことです。
それとは逆に、静的解析はプログラムを動かさずに行う解析となります。
よって、静的解析とは、主にコードを解析するモノです。
そのため、実際に発生する問題(メモリリーク、高負荷など)を解析することはできません。
そのような問題を解析したい場合は、プロフィリングを行います。
プロファイリングに関しては、次の記事で解説しています。
静的解析に話を戻します。
極端に言えば、静的解析はコードレビューツールです。
そのため、絶対になくてはならないモノではありません。
しかし、静的解析をやった方がいいことも事実です。
静的解析に関しては、それぐらいの温度感で取り組んだ方がよいでしょう。
PHPStanのインストール
2020年12月末時点におけるPHPStanの最新バージョンは、0.12.64です。
ソフトウェア要件
PHP 7.1以降が必要です。
これは、あくまでPHPStanが動く環境のPHPバージョンです。
解析対象となるPHPのバージョンということではありません。
つまり、PHP 5系もPHP 7系(PHP 8もですね)でも解析はできるということです。
あと、注意すべき点は、PHPがコマンドライン(php-cli)だということです。
以下のコマンドで確認できる方のPHPということです。
$ php -v PHP 7.2.24-0ubuntu0.18.04.7 (cli) (built: Oct 7 2020 15:24:25) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.24-0ubuntu0.18.04.7, Copyright (c) 1999-2018, by Zend Technologies
よって、上記コマンド確認した際のバージョンが、7.1以降である必要があります。
なぜか、このことがあまり触れられていません。
大抵、Webサーバーで動くPHPと同じバージョンだからか、それほど大きな問題にはなってはいませんが。
なお、私の環境では、コマンドラインのPHP(php-cli)しかインストールしていません。
インストール
composerによるインストールが、基本のようです。
$ composer require --dev phpstan/phpstan
インストールが完了したら、次のコマンドで動作検証します。
$ ./vendor/bin/phpstan analyse --version PHPStan - PHP Static Analysis Tool 0.12.64
ちゃんと最新バージョンがインストールされていますね。
PHPStanで実際のプロジェクトを静的解析
私が一人で開発したプロジェクトを静的解析してみます。
これは、クラウドワークス(500万円ほど)で受注したプロジェクトです。
今でも、月間10万PV以上のアクセスがあるサイトとして稼働中です。
このプロジェクトは、私一人のフルスクラッチ開発によるモノです。
もちろんコードレビューなんて受けていません。
つまり、やりたいように開発できたということです。
しかし、メンテナンスのことを考えてそんな無茶はしていないはず・・・
そう信じたい!!
では、解析しましょう。
解析には、レベル(0~7)を設定できます。
今回は、最も緩い「0」を設定しています。
$ ./vendor/bin/phpstan analyse -l 0 ./target/
実行した結果は、以下。
「なんじゃ、こりゃー!!」と心の中で叫びました。
せいぜい数個かなと思っていました。
エラーの内訳は、次の二つで8割を占めています。
- Static call to instance method 331個
- Undefined variable 89個
もちろん、実際の動作には影響はありません。
あったら大変なことです。
でも、コード的にはアウトということでしょう。
レベル0でこれなら、レベル7ならどうなることやら・・・
この結果を見て、反省しました。
動作に影響はないとは言え、さすがに気持ちが悪いです。
開発時点で常時PHPStanによる静的解析をしていれば、こんな結果にならないでしょう。
今回見てきたように、コマンドをサクッと実行するだけで静的解析ができます。
「静的解析なんて意味がない」と言って放置することはしません。
今後、PHPで開発をする際にはPHPStanで静的解析を行います。