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) などが非推奨になりました。放置すると、次のバージョンで動かなくなります。

お引き受けできること

古いバージョンから一度に上げる場合も、1 つずつ上げ続ける場合も、調査から本番の切り替えまでお引き受けできます。

事前の調査

静的解析で、移行先の PHP で動かない箇所と非推奨の箇所を洗い出し、移行の方法と作業の量をご報告します。

機械的な書き換え

削除された関数の置き換えや、新しい書き方への変換を、Rector で漏れなく一括して行い、差分をすべてレビューします。

テストの整備

結果だけが変わる変更に備えて、移行の前に、今の動きを自動テストと画面の操作のテストに記録します。

段階的なバージョンアップ

大きく離れたバージョンへは、1 つずつ上げ、そのつどテストで確かめながら進められます。

フレームワークとパッケージ

PHP の上で動くフレームワーク、Composer のパッケージ、PHP の拡張も、新しいバージョンに対応したものへ更新できます。

新しい書き方への改善

動くようにするだけでなく、型や enum など、新しいバージョンの書き方で、不具合の起きにくいコードに直せます。

リリースとサポートの期間

PHP 8.1 までのサポートは終了し、PHP 8.2 も 2026 年 12 月 31 日で終わります。

バージョンリリースサポートの終了
PHP 5.6―2018 年 12 月 31 日 (終了)
PHP 7.02015 年 12 月 3 日2019 年 1 月 10 日 (終了)
PHP 7.12016 年 12 月 1 日2019 年 12 月 1 日 (終了)
PHP 7.22017 年 11 月 30 日2020 年 11 月 30 日 (終了)
PHP 7.32018 年 12 月 6 日2021 年 12 月 6 日 (終了)
PHP 7.42019 年 11 月 28 日2022 年 11 月 28 日 (終了)
PHP 8.02020 年 11 月 26 日2023 年 11 月 26 日 (終了)
PHP 8.12021 年 11 月 25 日2025 年 12 月 31 日 (終了)
PHP 8.22022 年 12 月 8 日2026 年 12 月 31 日
PHP 8.32023 年 11 月 23 日2027 年 12 月 31 日
PHP 8.42024 年 11 月 21 日2028 年 12 月 31 日
PHP 8.52025 年 11 月 20 日2029 年 12 月 31 日
PHP 8.62026 年 11 月 19 日の予定―

PHP 7 系の主な変化

新しく使えるようになった書き方と、古いコードが動かなくなる変更、非推奨になった書き方です。一般的な業務の Web のシステムに関わるものを選んでいます。

PHP 7.0

新しい書き方スカラーの型の宣言、戻り値の型の宣言、??、<=>、無名クラス、random_bytes()・random_int()
動かなくなる変更多くのエラーが例外 (Error) として投げられるようになった。mysql、ereg、mssql の拡張の削除。ASP のタグの削除。foreach が配列の内部のポインターを動かさなくなった
非推奨PHP 4 の形のコンストラクター (クラスと同じ名前のメソッド)、static でないメソッドの static での呼び出し

PHP 7.1

新しい書き方null を許す型 (?string)、void、[$a, $b] = $array の分割代入、クラスの定数の公開の範囲、複数の例外をまとめて受ける catch (A | B $e)
動かなくなる変更ユーザーの関数に渡す引数が足りないと ArgumentCountError になった
非推奨mcrypt の拡張

PHP 7.2

新しい書き方object の型、Sodium の暗号の拡張、Argon2 でのパスワードのハッシュ
動かなくなる変更数えられない値の count() が警告を出すようになった。定義していない定数が警告になった (8.0 でエラー)
非推奨each()、create_function()、__autoload()、第 2 引数のない parse_str()

PHP 7.3

新しい書き方柔軟なヒアドキュメント、関数の呼び出しの最後の引数のあとのカンマ、array_key_first()・array_key_last()、is_countable()
動かなくなる変更ヒアドキュメントの終わりの記号の解釈の変更
非推奨大文字と小文字を区別しない定数 (define() の第 3 引数)、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 は、比較の結果やエラーの扱いが大きく変わったバージョンです。8.1 以降は、型と書き方の追加と、非推奨の整理が続いています。

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() などが、ロケールに関係なく ASCII の文字だけを変換するようになった
非推奨宣言していないプロパティ、文字列の中の ${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()、致命的なエラーのバックトレース
動かなくなる変更表せない float から int への変換と、NAN の変換で警告。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, ?))、readonly のプロパティの既定の値、clamp()
動かなくなる変更セッションの既定の設定が、より安全な値に (session.use_strict_mode=1、Cookie の HttpOnly、SameSite=Lax)
非推奨finally の中の return、is_double()・is_long()・is_integer()、define() の第 3 引数

技術者の方へ: 結果が変わる変更の例

エラーにならずに結果が変わる変更と、非推奨の警告が出る書き方の例です。非推奨の警告は、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 を含めて書く

ご相談・お問い合わせ

内容が固まっていない段階からご相談いただけます。各分野のプロフェッショナルがご対応いたします。ご相談・お見積もりは無料です。