PHP 5、PHP 7からPHP 8への移行、主な変更点
PHPのバージョンを変更した際に生じるコードの変更などについてまとめた。
PHPの新バージョンは処理速度が速くなっているので移行するメリットはあるが、移行する作業が面倒。 メジャーバージョンが上がると新たに追加される関数もあるが、廃止・削除される関数もあるので事前に動作テストを行う必要がある。 中にはコードを変更しないといけない場合もある。
PHPのアップデートにより新たに追加・削除された関数などについては PHPで追加または削除された関数 をご覧下さい。
PHP 8
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で上手く動作しないなと思ったら、まず配列関連を疑うと良い。
変数と三項演算子
PHP 8から未定義の変数について警告やエラーが出やすくなった。 そこでその対策として、今まであまり使用しなかった三項演算子を活用するようになった。 詳しくは PHPの三項演算子 をご覧下さい。
その他
その他気づいた点。
- (int)'' がPHP 7では空白だったが、PHP 8だと0(ゼロ)になる。
- mb_convert_kana() は通常 mode をクォーテーションで囲むが、PHP 7では囲まなくても動作していた。 PHP 8ではエラーとなる。
- mb_ereg() はマッチした場合、バイト長を返していた。 PHP 8からtrueを返すようになった。 mb_strlen、mb_strposなどを使って自分で計測する必要がある。
PHP 7
PHP公式サイトには、追加・変更された関数などが掲載されている。 削除された主なモジュールとして以下のものがある。
- ereg
- mssql
- mysql
- sybase_ct
以下、非推奨になったものも含めて紹介するが、非推奨のものは今後削除される可能性があるため使用しない方が良いだろう。
ereg の廃止
ereg 関係は削除されていて、以下の関数は廃止になった。
- ereg()
- eregi()
- ereg_replace()
- eregi_replace()
- split()
- spliti()
PHP 7 の変更点として一番影響があると思われる。 php.net では代わりに preg 系の使用を勧めている。 ereg といっても mb_ereg()、mb_eregi() などマルチバイト関係の関数は PHP 7 でも使える。
preg_replace() の /e 修飾子
正規表現にてPHPコードとして評価して実行できる /e 修飾子が廃止になった。 php.net では代わりに preg_replace_callback() の使用を勧めている。
foreach の内部配列ポインタ
foreach が内部の配列ポインタを使わなくなった。 私は使っていないが、使っている人は注意。
define() で配列が使えるようになった
定数を定義する define() で配列(array)が使えるようになった。 何度か配列を定義したいと思ったことがあったので嬉しい。
PHP 7.1
mb_ereg_replace() と mb_eregi_replace() で e 修飾子が非推奨になった。
PHP 7.2
each() 関数が非推奨になった。
read_exif_data() 関数が非推奨になった。 代わりに exif_read_data() 関数を推奨。