はてなブックマーク
X
Bluesky
Facebook
Pocket

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

更新:

2024年9月現在、PHPの最新バージョンは8.3。 一応5や7より処理速度が速くなっているので移行するメリットはある。 ただ、移行する作業が面倒。 メジャーバージョンが上がると追加される関数もあるが、廃止・削除される関数もあるので事前に動作テストを行う必要がある。 中にはコードを変更しないといけない場合もある。

ここでは私がバージョンアップ時に気づいた注意点、主な変更点について記す。

PHP 8

PHP 8は意外と厄介。 今までの経験からわりとスムーズに移行できると思いきや少し苦労した。 特に厄介なのは型のチェック。 PHP 8から型に関して少し厳格になった。 今まで警告のみだったものがエラー扱いとなった。 特によく使う配列でエラーが発生しやすい。

詳しくは公式サイト(php.net) PHP 7.4.x から PHP 8.0.x への移行 を参照。

配列

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

PHP 7

公式サイト php.net には PHP 5.6.x から PHP 7.0.x への移行 というページがあり、追加された関数や変更された関数などが掲載されている。 削除された主なモジュールとして以下のものがある。

  • 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() 関数を推奨。


はてなブックマーク
X
Bluesky
Facebook
Pocket