PHPStan導入のすすめ

こんにちは!
株式会社Hajimari21卒エンジニアの古田 鏡です。

普段は、TUKURUS事業部(旧PIECE事業部)で
自社プロダクトであるスタートアップ向けマッチングサイト構築パッケージPIECE
https://crowd.itpropartners.com/piece/)の開発や受託開発を行っています!
※2022年4月から事業部の方針変更により事業名が変更となりました!

crowd.itpropartners.com

現在ジョインさせていただいている案件では、
組織のオンボーディングシステムの新規機能開発・システム統合等を担当させていただいております。

開発言語に関してはバックエンドでPHPフレームワークはLaravel)を使っていて、
静的解析ツールPHPStanを導入しているのですが、
このツールが便利だったので今回はご紹介していきたいと思います!

PHPの特徴

そもそもPHPは「動的型付け言語」に分類され、
基本的にはデータ型の宣言がいらないプログラミング言語です。

※参考 動的言語と静的言語の違い

型の宣言がいらないことで得られるメリットとしては、

  • どのような型の値でも代入でき、型(文字列・数値・配列・オブジェクト等)を意識する必要がない
  • (型の宣言がいらない分)記述量が少なくすむ
  • ソースコードの変更(修正)に強い

この辺が挙げられるのではないかと思います。

私もこれまで実際PHPの案件をやっている中で、
型を意識せずに面倒から解放される点でPHP最高ー!!と思っていました。

ですが、現在携わっている案件で、複数人での開発・システム統合をする中で、
コードの統合・不要コード削除に伴い、影響範囲の大きな修正が増えたことで、
静的解析の重要性を身に染みて感じました、、、
(修正がバグを生む可能性大、、、テストコードを全て書くのは時間がかかりますし、、、)

そこでPHPStanの出番です!!

●PHPStanとは?

PHPStan は、
PHP コードの静的解析ツールです。 (PHP Static Analysis Toolの略)
https://phpstan.org/

MIT ライセンスで公開されており、
Composer でインストールして利用できます。
また、Docker イメージも公式で公開されております。

github.com

phpstan.org

概要
  • 動作にはPHP 7.2以降が必要
  • 未定義の変数・メソッド・Class・プロパティなどを検出
  • PHPDocの構文チェックが可能

●ルールレベル設定

PHPStanはルールレベル設定があり、
レベルは0~9の10段階で設定できます!
レベル9ともなると結構厳しめのチェックとなるようです、、、!

phpstan.org

Lev 内容
0 基本的なチェック、未知のクラス、未知の関数、$this上で呼び出された未知のメソッド、それらのメソッドや関数に渡された引数の数が間違っている、常に未定義の変数をチェック
1 未定義の変数、call と get を持つクラスの未知のマジックメソッドとプロパティがある可能性がある
2 ($this だけでなく)すべての式で未知のメソッドをチェックし、PHPDocs を検証する
3 戻り値の型、プロパティに割り当てられた型の確認
4 基本的なデッドコードチェック - instanceofやその他の型チェックが常にfalse、到達しないelse文、return後の到達不能コードなど
5 メソッドや関数に渡される引数の型チェック
6 タイプヒントの欠落を報告する
7 部分的に間違っている論理和型の報告 - 論理和型の一部の型にしか存在しないメソッドを呼び出した場合、レベル7はそのことを報告し始めます(その他の不正確な状況も)
8 null可能な型に対するメソッド呼び出しとプロパティへのアクセスを報告する
9 混合型に厳密であること - この型で唯一許される操作は、この型を別の混合型に渡すことである

下記に例題が載っているのでチェックしてみてください!

phpstan.org

●インストール方法

インストールする方法としては

phpstan.org

公式にインストールする方法が記載してあるので、それに従いインストールします。

Composerを使い下記のコマンドを実行します。

composer require --dev phpstan/phpstan

基本的に開発環境で使用するものだと思いますので、
--devオプションをつけるのが良いと思います。

インストールできているか確認

./vendor/bin/phpstan analyse --version
PHPStan - PHP Static Analysis Tool 0.12.99⇦インストールされているバージョンを表示

●実行方法

実行コマンド
./vendor/bin/phpstan analyse

ルールレベルを変更する場合には、 レベルを変更するには --level (-l )オプションで実行します。
↓ではレベル4で設定しています。

.\vendor\bin\phpstan analyse -l 4
設定ファイル(phpstan.neon 一部抜粋)
includes:
    - ./vendor/nunomaduro/larastan/extension.neon

parameters:

    paths:
        - app

    level: 4
実行結果

エラーありの場合

エラーなしの場合

こんな感じで結果が出ます。

●実際に使ってみて得られたこと

  • 導入のしやすさ
    基本的に公式通りでインストールでき、導入のハードルが低いこと。

  • 解析が高速にできる
    状況に応じて、ルールレベル・実行範囲を変えられ、必要部分に対して解析が高速にできること

  • レビューの負担軽減
    システム統合など大きな改修を行う場合、コードレビューの量が多くなりがちですが、
    事前に静的解析を行うことでレビューの量を減らせること
    (個人的にはこの効果が一番大きいと思いました。)

  • ある程度システムの安全性・整合性を担保できる
    型レベルの安全性・整合性が保たれること
    しかしながら、無限ループや関数の型がmixed・null許容の場合、解析をすり抜けてしまうことがあること

●まとめ

大前提として、別途ユニットテスト等は必要だと思いますが
導入と実行の容易さ、時間短縮の観点から非常にコスパの良いツールだと思いました!
プロジェクトが大きくなればなるほど、効果を発揮するツールだと思いますので、是非導入してみてはいかがでしょうか!


株式会社Hajimariでは、Laravelをメイン言語として自社開発・受託開発を行なっており、
一緒に開発を行なっていただけるエンジニア募集しています! 長野拠点の立ち上げメンバーも大募集しています!

興味のある方は以下の記事をぜひご覧ください!
みなさまとお会いできるのを心からお待ちしております!

www.wantedly.com www.wantedly.com www.wantedly.com