はじめに
PHP7.0 → PHP8系(8.0〜8.3)へアップグレードする際、
「破壊的変更」だけでなく 完全に削除された機能 にも注意が必要です。
これまで「非推奨(deprecated)」だったものが、
PHP8では本当に使えなくなっています。
この記事では、移行前に確認しておきたい
削除された主な機能 をまとめます。
1. create_function の削除
概要
$func = create_function('$a', 'return $a * 2;');
PHP7では既に非推奨でしたが、
PHP8では完全に削除されました。
代替
無名関数(クロージャ)を使用します。
$func = function ($a) {
return $a * 2;
};
ほぼ機械的に置き換え可能です。
2. each() の削除
概要
each($array);
内部ポインタを使った古い配列ループ関数。
PHP8で削除されました。
代替
foreach ($array as $key => $value) {
}
現在では foreach が標準的です。
3. __autoload の削除
概要
function __autoload($class) {
}
旧式のオートロード関数は削除されました。
代替
spl_autoload_register(function ($class) {
});
実務ではComposer利用が一般的なので、
影響は少ないケースが多いです。
4. 古いマジッククォート関連の完全削除
- get_magic_quotes_gpc()
- get_magic_quotes_runtime()
過去の名残機能は完全に削除されています。
現在では不要なので、
削除対応するのが基本です。
5. FILTER_SANITIZE_STRING の削除(PHP8.1)
filter_var($value, FILTER_SANITIZE_STRING);
セキュリティ的に誤解を招くため削除されました。
代替
用途に応じて
- htmlspecialchars
- FILTER_SANITIZE_SPECIAL_CHARS
などを明示的に使い分けます。
6. リソースからオブジェクトへの変更
いくつかの内部リソース型が
オブジェクトへ変更されています。
例:
- CurlHandle
- GdImage
is_resource() に依存しているコードは注意が必要です。
7. ext/mysql の完全廃止(過去バージョンからの流れ)
古い mysql_* 系関数は既に削除済みですが、
レガシー環境ではまだ残っていることがあります。
必ず
- mysqli
- PDO
へ移行しましょう。
8. その他削除・整理されたもの
- 一部の古いオプション
- 古い暗号化関連関数
- 非推奨だったINI設定の削除
「長年deprecatedだったもの」が
整理されたイメージです。
移行時のチェックポイント
削除機能は、実行時エラーというよりも
- 実行した瞬間 Fatal
- 関数が存在しないエラー
になります。
移行前に以下を実施すると安心です。
-
grepで対象関数を検索 - 静的解析ツール(PHPStan / Psalm)でチェック
- PHP8環境で一度実行してみる
まとめ
PHP8では
- 古い書き方
- 長年非推奨だった機能
- レガシーサポート
が整理されています。
「削除された」というより、
言語として健全になった印象です。
移行前に一度コードベースをスキャンしておくと、
スムーズにアップグレードできると思います。
どなたかの参考になれば嬉しいです。