PHP 7 と PHP 8 の違い|移行で困ることと、良くなること
PHP 7 と PHP 8 は何が違うのか。移行で動かなくなること、新しく使えるようになったこと、保守の期限の違いをまとめた。
PHP 7 から PHP 8 へは、大きく変わった。PHP2Shell の修正版が出ているのは 8.2 以降なので、7 系のサイトは 8 系への移行が必要になる。何が違うのかをまとめた。
この記事の要点
- PHP 7 系はすべて保守が終わっていて、PHP2Shell の修正版もない
- 8.0 で、削除された関数や比較のルールの変更があり、古いプログラムが止まりやすい
- 8 系では、JIT・名前付き引数・match 式など新しい書き方が増えた
- 移るなら 8.4(2028年12月31日まで)か 8.5(2029年12月31日まで)
保守の違い
| 系列 | 状態 |
|---|---|
| PHP 7.0〜7.4 | 保守終了(7.4 は 2022年11月28日に終了) |
| PHP 8.0・8.1 | 保守終了 |
| PHP 8.2〜8.5 | 保守中(8.2 は 2026年12月31日まで) |
移行で困ること(7.4 → 8.0)
create_function()・each()・money_format()・get_magic_quotes_gpc()などが削除0 == "foo"が false に(数値と文字列の比較の仕方が変わった)- 未定義の定数が、警告ではなくエラーに
- クラス名と同じ名前のメソッドが、コンストラクタとして扱われない
- 非 static メソッドを
Class::method()の形で呼ぶとエラー implode()の逆順の引数が使えない__autoload()が削除(spl_autoload_register()を使う)- PDO の既定のエラーモードが「例外を投げる」に
- 既定の
error_reportingがE_ALLになり、隠れていた警告が出る
8 系で良くなったこと
| 機能 | 版 | 内容 |
|---|---|---|
| JIT | 8.0 | 処理を速くする仕組み(使うには設定が必要) |
| 名前付き引数 | 8.0 | 引数を名前で渡せる |
| match 式 | 8.0 | switch より安全に書ける |
| nullsafe 演算子 | 8.0 | ?-> で null のときに止まらず進める |
| enum | 8.1 | 決まった値の一覧を型として書ける |
| readonly プロパティ | 8.1 | 一度入れたら変えられない値 |
8 系の中でも気をつけること
- 内部関数に null を渡すと非推奨の警告(
strlen(null)など) htmlspecialchars()などの既定がENT_QUOTES | ENT_SUBSTITUTEに- MySQLi が既定でエラー時に例外を投げる
E_STRICTの定数が非推奨- DBA・ODBC・SOAP の一部で
is_resource()の判定が効かない
よくある質問
PHP 7.4 から 8 系に上げると、どこが動かなくなりますか?
削除された関数(create_function・each など)、数値と文字列の比較の変更、未定義の定数がエラーになることなどが代表的です。
PHP 8 移行チェックで、プログラムを貼って確かめられます。
PHP 8 にすると速くなりますか?
多くの場合、速くなります。
ただし速さより、保守が続く版に移ることのほうが大切です。
参考にした情報
- php.net(2026年10月21日のセキュリティ告知)
- php.net:Supported Versions
- php.net:Unsupported Branches
- php.net:付録(移行ガイド)
この記事の情報
2026年10月22日時点の公開情報にもとづく。最新は各公式のページを確認すること。
URL を入れるだけで、PHP2Shell の危険度と今やることが分かる。移行の相談もできる。
無料で診断する


