PhanCompatibleReadonlyPropertyの解消

PhanCompatibleReadonlyPropertyの解消

2月 14, 2022

2020年11月26日にPHP8.0がリリースされ、その1年後の2021年11月25日にPHP8.1がリリース。
メジャーアップデートによりenum型やmatch式など様々な構文がサポートされました。

PHP8.1にアップデート、新構文を使い始める


早速、PHP8.1の環境下で新構文を採用しながらのリファクタを実施。

  • コンストラクタ初期化子
    • オブジェクトのプロパティ定義の冗長さを無くす
  • match式
    • switch文とは異なる式の利点を活かした弱い比較(==)の排除と結果の利用
  • readonlyプロパティ
    • 読み取り専用プロパティによるprivateなプロパティとgetterの冗長さを無くす

など、利用した構文は僅かですが、新たな記法によってコーディングの幅が広がりました。

いざ、静的解析を実施するが…


あらかたのコーディングを終えphpstan(larastan), phan, codesnifferなどの静的解析を実施を試みました。
するとphanからPhanCompatibleReadOnlyPropertyなるものが。(一部です)

Cannot use readonly modifier on property {PROPERTY} before php 8.1

上記はreadonlyプロパティに関するものですが、PHP8系の構文が利用できないと怒られました。
ここでうっかりミスに気づきphanのバージョンを最新(執筆時点では5.3.2)にすべくcomposer install

そして満身創痍でphanを実行しましたが結果は変わらず。

原因:configファイルの見落とし


PHP・phanのバージョンは問題ないものの、PHP7系としてphanの解析が実行されている状態。

色々思考を巡らせつつ、ひとまずローカルのphanの設定ファイルであるconfigファイルを確認。
すると…

Phan is a static analyzer for PHP. Phan prefers to avoid false-positives and att…
github.com
'target_php_version' => 7.4,

解析対象のPHPバージョンが7.4に指定されていました。ビンゴ。
8.1に修正した上で再度phanを実行すると8系の構文も問題なくパスしました。

target_php_version => nullであればphanを実行するPHPのマイナーバージョンに最も近いバージョンを想定してくれるようなので気にならない可能性もありましたが、明示的にバージョン指定をしていたが故に発生した状況でした。