PHP 7からPHP 8への移行、変更点

更新:2022-10-13

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などを使って自分で計測する必要がある。


このエントリーをはてなブックマークに追加