PHP 8がリリース(2020年)されてからだいぶ経つが、2022年に入りようやく私が運営している全てのサイトをPHP 7からPHP 8へ移行した。
わりとすんなり移行できると思いきや、いくつか問題点があった。 削除された関数については特に問題なかったが、主に型に関する箇所でコードの修正が必要になった。 ここでは、備忘録として主な変更点について記しておく。
PHP 8から型に関して少し厳格になった。 今まで警告のみで無視されていたものがエラーとなった。 そのため、そこでプログラムが停止し、真っ白のページが表示されることになる。
型といってもstringやintなどはそれほど問題ないが、最も影響があったのがarray(配列)である。
例えば、よく使う関数として配列の数をカウントする count() がある。 予め配列を指定しておけばエラーとならないが、配列でない変数や未定義の変数に対して使うとエラーが発生するようになった。
$a = array(); echo count($a);//OK $b = ''; echo count($b);//エラー echo count($c);//エラー
通常は、事前に配列を指定したり何らかの配列が入っているはずだが、雑に書いたコードだと稀に文字列(空文字)または未定義などの場合がある。 そういうときはエラーが発生し、そこでプログラムが止まる。
これは count() に限らず、array_unique() など配列を扱う関数で概ね起きる。
PHP 8で上手く動作しないなと思ったら、まず配列関係の関数を疑うと良い。
その他私的なコードの変更点。
(int)'' がPHP 7では空白だったが、PHP 8だと0(ゼロ)になる。
mb_convert_kana() は通常 mode をクォーテーションで囲むが、PHP 7では囲まなくても動作していた。 PHP 8ではエラーとなる。
mb_ereg() はマッチした場合、バイト長を返していた。 PHP 8からtrueを返すようになった。 mb_strlen、mb_strposなどを使って自分で計測する必要がある。