PHP のバージョンごとの書き方の変化
PHP は毎年 11 月ごろに新しいバージョンが出ます。新しい書き方が加わる一方で、古い書き方は非推奨になり、いくつかのバージョンのあとで動かなくなります。
KEY SELECT は、事前の調査で直す箇所と作業の量を確かめ、テストを整えてから、1 つずつ確実にバージョンを上げられます。
すべての作業を、セキュリティを意識して進めます。
移行で問題になる変更
関数の
削除された関数と拡張
PHP 7.0 で mysql_ で始まる関数や ereg が、PHP 8.0 で each () や create_function () が削除されました。新しい書き方への置き換えが必要です。
結果だけが変わる比較
PHP 8.0 から、0 == "foo" が true から false になりました。条件の分岐の結果が変わってもエラーは出ないため、テストで確かめる必要があります。
警告からエラーへ
PHP 8.0 で、
非推奨の積み重ね
組み込みの関数に null を渡す書き方 (8.1)、宣言していないプロパティ (8.2)、暗黙の nullable (8.4) などが非推奨になりました。放置すると、次のバージョンで動かなくなります。
お引き受けできること
古い
事前の調査
静的解析で、
機械的な書き換え
削除された
テストの整備
結果だけが
段階的なバージョンアップ
大きく
フレームワークとパッケージ
PHP の
新しい書き方への改善
動くように
リリースとサポートの期間
PHP 8.1 までの
| バージョン | リリース | サポートの |
|---|---|---|
| PHP 5.6 | ― | 2018 年 12 月 31 日 (終了) |
| PHP 7.0 | 2015 年 12 月 3 日 | 2019 年 1 月 10 日 (終了) |
| PHP 7.1 | 2016 年 12 月 1 日 | 2019 年 12 月 1 日 (終了) |
| PHP 7.2 | 2017 年 11 月 30 日 | 2020 年 11 月 30 日 (終了) |
| PHP 7.3 | 2018 年 12 月 6 日 | 2021 年 12 月 6 日 (終了) |
| PHP 7.4 | 2019 年 11 月 28 日 | 2022 年 11 月 28 日 (終了) |
| PHP 8.0 | 2020 年 11 月 26 日 | 2023 年 11 月 26 日 (終了) |
| PHP 8.1 | 2021 年 11 月 25 日 | 2025 年 12 月 31 日 (終了) |
| PHP 8.2 | 2022 年 12 月 8 日 | 2026 年 12 月 31 日 |
| PHP 8.3 | 2023 年 11 月 23 日 | 2027 年 12 月 31 日 |
| PHP 8.4 | 2024 年 11 月 21 日 | 2028 年 12 月 31 日 |
| PHP 8.5 | 2025 年 11 月 20 日 | 2029 年 12 月 31 日 |
| PHP 8.6 | 2026 年 11 月 19 日の | ― |
PHP 7 系の主な変化
新しく使えるようになった書き方と、古いコードが動かなくなる変更、非推奨になった書き方です。一般的な業務の Web のシステムに関わるものを選んでいます。
PHP 7.0
| 新しい | スカラーの??、<=>、random_bytes()・random_int() |
| 動かなくなる | 多くのエラーが例外 (Error) として投げられるようになった。mysql、ereg、mssql の拡張の削除。ASP のタグの削除。foreach が配列の内部のポインターを動かさなくなった |
| 非推奨 | PHP 4 の |
PHP 7.1
| 新しい | null を許す型 (?string)、void、[$a, $b] = $array の分割代入、クラスの定数の公開の範囲、複数の例外をまとめて受ける catch (A | B $e) |
| 動かなくなる | ユーザーの |
| 非推奨 | mcrypt の |
PHP 7.2
| 新しい | object の |
| 動かなくなる | 数えられないcount() が |
| 非推奨 | each()、create_function()、__autoload()、parse_str() |
PHP 7.3
| 新しい | 柔軟なヒアドキュメント、関数の呼び出しの最後の引数のあとのカンマ、array_key_first()・array_key_last()、is_countable() |
| 動かなくなる | ヒアドキュメントの |
| 非推奨 | 大文字とdefine() のstrpos() などに |
PHP 7.4
| 新しい | プロパティの型、アロー関数 fn($x) => $x * 2、??=、配列の中の展開 [...$a, ...$b]、数値の区切り 1_000_000 |
| 動かなくなる | null やfn が |
| 非推奨 | かっこのない入れ子の三項演算子、波かっこでの文字列のオフセット ($str{0})、money_format()、オブジェクトへの array_key_exists() |
PHP 8 系の主な変化
PHP 8.0 は、
PHP 8.0
| 新しい | 名前付き引数、アトリビュート、コンストラクターでのプロパティの宣言、複数の型のどれか (int|string)、match、?->、mixed、式としての throw、str_contains()・str_starts_with()・str_ends_with() |
| 動かなくなる | 数値と文字列の比較の変更。each()、create_function()、__autoload()、PHP 4 の形のコンストラクターなどの削除。多くの警告が Error・TypeError に。定義していない変数や配列のキーが、通知から警告に。@ で致命的なエラーを隠せなくなった。PDO の既定のエラーの扱いが例外に |
| 非推奨 | 省略できる |
PHP 8.1
| 新しい | enum、readonly のプロパティ、strlen(...) の形の関数の参照、never、引数の既定の値での new、Fiber、array_is_list() |
| 動かなくなる | mysqli の既定のエラーの扱いが例外に。htmlspecialchars() の既定のフラグが ENT_QUOTES | ENT_SUBSTITUTE に。組み込みのクラスを継承したメソッドの戻り値の型 (合わないと非推奨の警告、#[\ReturnTypeWillChange] で抑えられる) |
| 非推奨 | 組み込みの関数の、null を受け付けない引数に null を渡すこと。小数点以下が失われる float から int への暗黙の変換。Serializable だけを実装したクラス |
PHP 8.2
| 新しい | readonly のクラス、(A&B)|null のような型の組み合わせ、null・false・true の単独の型、トレイトの定数、#[\SensitiveParameter](エラーの記録に引数を残さない) |
| 動かなくなる | strtolower()・strtoupper() などが、 |
| 非推奨 | 宣言していない${var} のutf8_encode()・utf8_decode() |
PHP 8.3
| 新しい | クラスの定数の型、#[\Override](親のメソッドを上書きしていることを確かめる)、json_validate()、mb_str_pad() |
| 動かなくなる | 日付の |
| 非推奨 | 数値ではない++・--、get_class()、assert_options() |
PHP 8.4
| 新しい | プロパティフック、読み書きで公開の範囲を分ける書き方 (public private(set))、#[\Deprecated]、かっこで囲まない new Foo()->method()、array_find()・array_any()・array_all() |
| 動かなくなる | E_STRICT の削除。exit() が関数のように動き、型が合わないと TypeError に。IMAP、OCI8 などの拡張が PECL に移った |
| 非推奨 | null を既定の値にした引数の型に null を書かないこと (暗黙の nullable)、trigger_error() の E_USER_ERROR、セッションの ID の長さなどの設定の変更 |
PHP 8.5
| 新しい | パイプ演算子 |>、clone() でプロパティを変えながら複製、#[\NoDiscard](戻り値を使わないと警告)、URI の拡張、array_first()・array_last()、致命的なエラーのバックトレース |
| 動かなくなる | 表せないdisable_classes の |
| 非推奨 | バッククォートでのコマンドの実行、(integer)・(boolean)・(double)・(binary) の型の変換、配列のキーとしての null、case X;(コロンではなくセミコロン)、ドライバーごとの PDO の定数 (PDO::MYSQL_ATTR_* から Pdo\Mysql::ATTR_* へ) |
次のバージョン (PHP 8.6)
2026 年 10 月 25 日の時点ではリリース候補 (RC) の段階で、2026 年 11 月 19 日に正式なリリースの予定です。正式なリリースまでに、内容が変わる可能性があります。
| 新しい | 引数のf(1, ?))、clamp() |
| 動かなくなる | セッションの既定の設定が、より安全な値に (session.use_strict_mode=1、Cookie の HttpOnly、SameSite=Lax) |
| 非推奨 | finally のreturn、is_double()・is_long()・is_integer()、define() の |
- 出典: php.net の移行ガイド (Migrating from older versions)、Supported Versions、Unsupported Branches、PHP 8.6 release schedule(2026 年 10 月 25 日に確認)
技術者の方へ: 結果が変わる変更の例
エラーにならずに結果が変わる変更と、非推奨の警告が出る書き方の例です。非推奨の警告は、PHP の本番用の設定では表示されないため、テストで見つけます。
<?php
// 数値と文字列の比較(PHP 8.0)
var_dump(0 == "foo"); // PHP 7: true → PHP 8: false
var_dump(0 == ""); // PHP 7: true → PHP 8: false
// 組み込みの関数に null を渡す(PHP 8.1 で非推奨)
echo strlen($name); // $name が null だと非推奨の警告
echo strlen($name ?? ''); // 値がないときの扱いを明示する
// 宣言していないプロパティ(PHP 8.2 で非推奨)
$user->nickname = 'kei'; // クラスで宣言していなければ非推奨の警告
// null を既定の値にした引数(PHP 8.4 で非推奨)
function find(string $id = null) {} // 暗黙の nullable
function find(?string $id = null) {} // 型に null を含めて書く
ご相談・ お問い合わせ
内容が