PHP5からPHP8への移行は何が面倒なのか
先日8.2がリリースされたのにまだPHP5の話をしてるのかと思われそうですが、実際にまだPHP5で運用されているシステムがあり、移行に関する問い合わせがくるので仕方ありません。
これは今までお問い合わせを受けて、PHP5で動作しているシステムをPHP7/8に対応させる時に、どのあたりが面倒だったかを大雑把にまとめた個人の感想です。
それでは順番に。
(1) DB(MySQL)アクセスにPEAR::DBやPEAR::MDB2が使われている
PHP5の初期の頃に作成されたものだと、DBアクセスにPEAR::DBやPEAR::MDB2が使われていることが多かったと思います。
PHP7において、mysql_*系の関数は削除されました。そして、PEAR::DBやPEAR::MDB2はmysql_*系の関数を使っているため、これらのモジュールは使えなくなりました。 mysqli_*系の関数やPDOを使った処理に書き換える必要があります。 データベースへのアクセス処理はシステムのあちこちに散らばっていることが多いため修正箇所多くなる傾向があります。
(2) 廃止関数があちこちで使われている
上記のmysql_*系の関数以外にも、ereg_系関数やsplit()関数など廃止された関数がありますが、それらがあちこちで使われているケースです。
廃止関数の使用系はphpstanやPhpStormのcode inspection等の静的解析ツールで見つけられるのと、単純に置換して修正できるケースが多いので、単純作業に落とし込みやすい修正ではありますが。
(3) 以前は許容されていた文法が使われている
PHPは元々、プログラマー以外の人にも簡単に扱えるようにするためか、あれこれ自動でやってくれたり(*1)、文法的におかしくてもよしなに扱って処理してくれていましたが、最近のバージョンでは正しい書き方を求められる傾向にあります。
例えば、PHP5までは以下のように配列のキーに未定義の定数でアクセスした場合も、$array['foo']と解釈して正常にアクセスできていましたが、PHP7以降ではUndefined constant "foo" のようなエラーになります。
PHP5では許されていた記述
$array = array('foo' => 'bar'); print $array[foo]; // 'foo'ではなく未定義定数のfooでアクセス
PHP5の頃に開発されたものは、わりと緩いコーディングがされているケースもあるのでこういったものを修正していく必要があります。
(4) 何らかのフレームワークの上に構築されている
LaravelとかCakePHPとかのフレームワーク上に構築されたシステムだと、それらも最新のものに更新する必要があります。
PHP5の時代からの更新だと、フレームワーク自体にも互換性のない変更が多く含まれているので、修正箇所の洗い出しが必要になります。
(5) 緩いコーディングの修正
(3)とも重複しますが、今までE_NOTICEレベルでわりと許容されていた書き方が、PHP8からE_WARNINGレベルに格上げされたものがあります(以下)。
- 未定義の変数を読み取ろうとした場合
- 未定義のプロパティを読み取ろうとした場合
- 未定義の配列のキーを読み取ろうとした場合
- オブジェクトでない値のプロパティを読み取ろうとした場合
- 配列でない値のインデックスにアクセスしようとした場合
- 配列を文字列に変換しようとした場合
- リソースを配列のキーとして使おうとした場合
- null や bool 値や float の値を文字列オフセットとして使おうとした場合
- 境界を超えて文字列のオフセットを読み取ろうとした場合
- 文字列のオフセットに空文字列を割り当てようとした場合
https://www.php.net/manual/ja/migration80.incompatible.phpより引用
このうち、未定義の変数/プロパティ/配列のキーへのアクセスについては、頻発する印象があります。
未定義の変数/プロパティへのアクセスについては静的解析ツールで検出できますが、配列へのキーアクセスについては、個別にコードをチェックしたり、動作させて洗い出していくしかないのが現状です。
未定義の配列キーへのアクセス
array = []; print $array['foo']; print $array['foo'] ?? ''; // 修正
"WARNINGで動作は停止しないので、ほっとけばいい"という考え方もありますが、 仕事として引き受けるならこの辺も修正しておきたいところです。さらに将来のPHPバージョンで、E_ERRORにされないとも限りませんしね。
(6) テスト
修正作業ではありませんが、あちこち修正した後、網羅的なテストが必要になります。システムの規模が大きくなると、この工数もばかになりません。
以上が印象に残っている点です。他にも思いだしたら追記するかもしれません。
以上、大雑把な感想でした。
以下、宣伝です。
うちにお問い合わせいただくのは、サーバー会社に古いバージョンのPHPの提供が打ち切られるので、新しいバージョンに移行したいというものが多いです。このため、結構古いシステムが多く、修正箇所の調査も大変ですが、よほど規模の大きなものでなければ調査作業も含めてお見積もりは無料で対応しております。
(*1) magic_quotes_gpcの設定とか。
投稿日:2022/12/23 12:14