PHP8などへ移行する際の互換性チェック
「PHP5からPHP8への移行は何が面倒なのか」の記事などに"PHP8移行ツール"とか"互換性チェックツール"というキーワードでたどり着いている人がいるようなので補足しておきます。
いきなりとどめを刺すようで悪いのですが、PHP5とかPHP7からPHP8へ自動移行をするようなツールはおそらくありません(*1)。ただ、互換性のチェックを"ある程度"助けるものとして、静的解析ツールというジャンルのツールを使うことはできます。
開発者でない人向けにざっくり説明すると、静的解析ツールとは、ソースコードをチェックして、エラーやバグの可能性がある怪しい箇所を指摘してくれるツールです。対象のスクリプトを実際には動作させずに内容をチェックすることから"静的"解析と呼ばれます。
PHP8に移行したいスクリプトを静的解析ツールにかければ、"ある程度"は修正箇所の洗い出しができます。今回は私がよく使っているツールを二つ紹介します。細かい使い方の説明はないので、詳細は公式サイトなどを参照してください。
(1) PHPStan
PHPの静的解析ツールで有名なのは無料のものだとPHPStanでしょう。簡単な設定ファイルを作って、解析を実行すればいろいろチェックしてくれます。
PHPStanの設定(phpstan.neon)例
parameters: level: 5 phpVersion: 80200 # PHP 8.2 paths: - web
解析の実行
$ phpstan analyze -c phpstan.neon
削除されてしまった関数を呼び出していた場合などに、以下のように指摘してくれます。
すでに存在しないsplit()関数を使っていた場合
------ --------------------------------------------------------------------- Line XXXXXX.php ------ --------------------------------------------------------------------- 21 Function split not found. 💡 Learn more at https://phpstan.org/user-guide/discovering-symbols ------ ---------------------------------------------------------------------
PHP5とかの古いバージョンでは許されていたが、現在ではエラーになるような記述についても検出できます。
例えば、PHP5までは以下のように配列のキーに未定義の定数でアクセスした場合も、処理系が$array['username']と解釈して正常にアクセスできていました。しかし、PHP7からはUndefined constant "username" のようなエラーになります。
PHP5では動作する記述
$user = array('username' => 'tarou'); print $user[username]; // 'username'ではなく未定義定数のusernameでアクセス
このようなものも検出してくれます。PHP5の頃からメンテされていないスクリプトには、このようなずさんな書き方が残っている場合も多いので、それらを洗い出すのに助かります。
現在では許されていない書式の検出
------ --------------------------------------------------------------------- Line XXXXXX.php ------ --------------------------------------------------------------------- 21 Constant username not found. 💡 Learn more at https://phpstan.org/user-guide/discovering-symbols ------ ---------------------------------------------------------------------
(2) PhpStorm
有料のものならPhpStormがあります。
PhpStormは静的解析ツールというより開発用のIDEですが、Code Inspectionという静的解析機能が組み込まれているので、これを使うことでコードのチェックができます。PHPStanとの連携もできるので、PHPStanを設定しておけば、Code Inspectionの結果にPHPStanの結果も合わせて出力してくれます。PHPStanよりもより詳細なチェックを行ってくれます(少しうるさいほどに)(*1)。

図1は文字列への変数の埋め込みに関する警告です。PHPでは文字列に変数を埋め込む際、以下のような記述ができますが、${foo}のような書き方はPHP8.2ではDeprecatedになりました(いずれはエラーになるでしょう)。
文字列への変数埋め込み
"$foo" "{$foo}" "${foo}" ← 8.2ではE_DEPRECATED
こういったものも検出してくれるので重宝します。
静的解析ツールを使えば万全か
以上が私が使っている静的解析ツールでしたが、静的解析ツールを使って修正箇所を洗い出せば、「移行作業なんてちょちょいのちょいですよー」かというとそういうわけでではありません。
「PHP5からPHP8への移行は何が面倒なのか」にも書きましたが、"Undefined array key"警告のように、上記のツールでは検出されないものもあります。そして、PHP7からPHP8に移行する際にもっとも厄介なのがこのWarningだと、個人的には考えています。Warningにとりあえず目をつぶるなら話は別ですが。
また、LaravelのようなフレームワークやSmartyのような外部ライブラリを使っている場合、それらもまとめてアップデートする必要があります。 PHP5の頃のシステムをPHP8に対応させるとなると、こういった外部モジュールの非互換な変更も多いので、対応作業がそれなりに必要になるはずです。
最新PHPへの移行作業について
静的解析ツールは、開発時にバグを早期に検出するために使われるものですが、移行作業にもある程度使うことができるということを説明しました。ただ、開発者でない人が使うには少し難しい/面倒かもしれません。
上記のとおり、最新PHPへの対応作業もツールで楽々というわけにはなかなかいきません。自力で対応するのが難しい場合は、弊社でも、対応作業を承っております。
お見積もり時の流れや費用感などは「PHPの更新作業(PHP8対応作業)」をご参照ください。
お見積もり時に修正箇所の洗い出しをしますので、作業を依頼いただかなくても見積りついでに、今後のアドバイスくらいはできるかもしれません。
(*1) XXXの関数を置換するだけ、のような限定的なものならあるかもしれませんが。
(*2) どのようなチェックを行いたいかは設定で細かく変更できます。
投稿日:2023/01/26 11:40