そもそも PHP 9 って存在してる?
まだ影も形もありません。けど GitHub には PHP 9 って名前の箱 (Milestone) があって、そこに 「8.x では入れにくい破壊的変更」 がポイポイ投げ込まれています。
来たときに慌てる vs. 今のうちに慌てとく ── 後者派として、この記事では「未来箱に何が詰まってるか」を一気に棚卸しします。
キーワード: RFC / strict typing / BC break / WordPress 勢の運命
2025/08/19修正:
- Autovification on faleの説明を追加
- ModernCompression、TrueAsyncのRFC及び議論スレッドへのリンクを追加
- 1. そもそも PHP 9 って存在してる?
- 2. マイルストーンの中を覗いてみた結果
- 3. 破壊的 RFC ざっくり5選(+ミニコード)
- 3.1. Undefined Variable Error Promotion 🛑 採択済み
- 3.2. Autovivification on false 廃止 🛑 採択済み
- 3.3. 実務でどのコードが危ないか(代表例)
- 3.4. Autovivificationって?
- 3.5. Modern Compression 🚧 議論中
- 3.6. True Async 🚧 議論中
- 3.7. 暗黙キャスト縮小 💭 アイデア段階
- 4. いつ GA するの? — 歴史と期待値
- 5. もっと厳密な PHPはホントに来る?
- 6. やっておけばPHP9と即友達チェックリスト
- 7. WordPress がPHP9に対応できる可能性を予想
- 7.1. 問題はプラグイン地獄
- 8. LTS とビジネス影響を秒速でイメージ
- 9. まとめ 〜 PHP 9 は“警告ゼロ戦士”への昇格試験だ!
- 9.1. 参考リンク
- 10. FAQ
マイルストーンの中を覗いてみた結果
観測ポイント | 2025‑06‑04 時点の様子 |
---|---|
GitHub Milestone | php/php-src • PHP 9 — 6 open / 0 closed Issues、due‑date なし (要するに未定) |
主要タグ | engine , fatal-errors , strict-typing |
話し合いの場 | internals ML と GitHub RFC PR |
👀 方針ざっくり
- 8.x は互換性キープしつつ新機能追加
- “壊す系” は全部 9 箱へストック
破壊的 RFC ざっくり5選(+ミニコード)
Undefined Variable Error Promotion 🛑 採択済み
echo $foo; // PHP 8.x → Warning
// PHP 9 → Error (例外)
超初歩的だけど稼働済みのときの謎エラーたまにこれ。

未定義の変数echoするのはやめようね〜。
Autovivification on false
廃止 🛑 採択済み
Autovivification on false
は 8.1 で deprecated(非推奨)となり、PHP 9.0 ではfalse
からの自動配列化が致命的エラーになる予定です。
重要:未定義変数(undefined)や
null
からの autovivification は継続許可とRFCに明記されています(影響はfalse
のみ)。
// NG(9.0 で Fatal の可能性)
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row['name']; // $row が false のとき致命的
// OK(安全)
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row === false) {
// 行がない or 失敗 → 明示的に処理
// throw new RuntimeException('no row');
$row = []; // あるいはエラーハンドリング
}
echo $row['name'] ?? 'デフォルト';
実務でどのコードが危ないか(代表例)
scandir()
/parse_ini_file()
/glob()
などは「成功時は配列、失敗時はfalse
を返す」関数。失敗パスを配列操作すると 9.0 で致命的になる。PHPPDO::fetch()
やPDO::query()
は失敗でfalse
を返すことがある(fetch で行がない =false
)。その戻り値に対して['col']
をすると危険
Autovivificationって?
もともとの意味は「参照したら自動で配列(あるいは構造)を作ってくれる」挙動のこと。
で、“on false” が廃止になって問題になりそうなことは
通常、スカラー値(true
/0
/文字列など)に対して配列アクセスするとエラーになるはずだけど、過去の PHP は例外的に false
に対して $v[] = ...
とすると false
を配列に変換してしまっていた。
つまりこのようなコードが動いていた:
$var = false;
$var[] = 2; // 以前は自動で配列に変わっていた
この「false
を配列に自動変換する」挙動が autovivification on false。これが 8.1 で deprecated(非推奨通知)になり、9.0 で削除(致命的エラー)予定
今まではこの場合、$varのfalseが消えて$var配列の0番目に2が入った。
未定義変数から、nullからのautovivificationは変わらず許容される模様。(2025/8/19現在)
rfcから引用:
The proposal is to disallow autovivification from false values. We will continue to allow autovivification from undefined variable and null, but in every other case an error message will be shown:
https://wiki.php.net/rfc/autovivification_false
Modern Compression 🚧 議論中
zstd
/ brotli
を core に組み込む Modern Compression RFC が提出され、議論中です(提案者は 8.5 系への導入を想定しています)。ただし現時点では確定ではない。
👉️ ModernCompressionのRFC https://wiki.php.net/rfc/modern_compression
👉️ RFCについての議論 https://externals.io/message/126439
True Async 🚧 議論中
async function fetch() {
$data = await http_get($url);
}
全 PHPer が欲しいけど採用票はまだ割れてる。
これが入ると、非同期モデルをPHPに導入するに等しいのでかなり大幅な変更になりそう。
👉️ TrueAsyncのRFC https://wiki.php.net/rfc/true_async
👉️ RFCについての議論 https://externals.io/message/127120
暗黙キャスト縮小 💭 アイデア段階
文字列⇔数値の自動変換をさらに絞る案。「'10abc' == 10
やめません?」って話。
RFC は採択後に「やっぱ 8.7 で出すわ」って動くこともザラ。最新は GitHub ウォッチ推奨。
いつ GA するの? — 歴史と期待値
メジャー | GA | 次の GA まで | ざっくり周期 |
PHP 7.0 | 2015‑12 | 5 年 | 7 → 8 |
PHP 8.0 | 2020‑11 | 6? | ←イマココ |
2026〜27 年 が最短シナリオ。でも 8.x で吸収できる RFC が多いからズレ込むかも、が現場の勘。
もっと厳密な PHPはホントに来る?
結論だけ先に → 全面 strict デフォルトは五分五分。でもピンポイント厳格化は確定で進む。
年 | イベント | 影響度 | コメント |
2015 | Scalar Type Hints v5 可決 | 🟡 | ファイル単位 strict/weak 折衷案で実装 |
2021‑24 | Warning 昇格まつり | 🟡 | 未定義アクセスが次々と警告化 |
2025 | UndefinedVariable → Error | 🔴 | 9.0 で Fatal 予定(採択済み) |
strict_types=1 を全ファイルに貼れる体制 が組めてれば、9.0 の山は7合目クリアと言える。
やっておけばPHP9と即友達チェックリスト
phpstan
/psalm
レベル MAXerror_reporting(E_ALL)
を CI に入れて Warning=CI FAIL にdeclare(strict_types=1);
全面採用- Throwable 捕捉 — シリアライズ等で Warning に頼らない
- 依存ライブラリの 8.5 対応状況をウォッチ

CI赤にしないように頑張ろうねぇ〜
WordPress がPHP9に対応できる可能性を予想
WP ver | 対応 PHP | 状態 |
6.3 | 8.0 / 8.1 | 🟢 完全対応 |
6.4 | 8.3 | 🟡 β対応 |
6.7 | 8.4 | 🟡 β対応 |
- コアは案外タフ
- nightly でテスト回してるし、polyfill 大好きだから PHP9.0 でも多分生きる。頑張れ20年選手。
問題はプラグイン地獄
- レガシー作者が strict 対応放棄 → White Screen of Death 量産
- 共有レンタルサーバーが PHP 7.x を引き上げた瞬間 “なんちゃって PHPer” は淘汰
LTS とビジネス影響を秒速でイメージ
- IaaS/PaaS — 9.0 GA しても 8.x LTS が 1 年は残る。エンプラ案件は慌てなくて良し。
- Laravel/Nest — GA + 6 か月で “9.x 対応” ブランチ切るのが最近の癖。
- 新人教育 — 厳密型がデフォになると 👉 「最初から安全な PHP」 で onboarding がラク。
まとめ 〜 PHP 9 は“警告ゼロ戦士”への昇格試験だ!
- PHP 9 そのものは霧だけど RFC は既にコードを書き換え始めている。
- Warning をゼロ、静的解析 MAX にしておく → 9.0 アップグレードが “バージョン番号の差し替え” で終わる。
- GitHub Milestone ★Star、internals ML ★Watch で「未来箱」をリアルタイム監視。
要するに “慌てるな。今慌てとけ。” です 🫡
参考リンク
- GitHub Milestone — https://github.com/php/php-src/milestone/6
- RFC 一覧 — https://wiki.php.net/rfc
- PHP 8.5 スケジュール — https://wiki.php.net/todo/php85
FAQ
-
RFC って何?
-
“Request For Comments” の略。PHP コア開発者が「こういう機能どうスか?」と投げる企画書。ML で議論→投票(2/3 ルール)→可決なら実装、という流れ。つまり 仕様の Pull Request。
-
GA って何?
-
“General Availability”=正式リリース。βとか RC とかの肩書きが取れて「本番で使ってヨシ!」状態。
-
LTS って何?
-
“Long Term Support”。バグ/セキュリティ Fix だけ数年続ける安定ブランチ。Ubuntu でおなじみ。
-
nightly でテスト& polyfill 大好き → 何が安全?
-
nightly = 開発版 PHP を毎晩ビルド→CI。そこで落ちたら「明日の本番で死ぬバグ」を前日に潰せる。
polyfill = 新 API を旧バージョンでも真似る関数。=「最新版でも古い版でも動く」保証が取れる。WordPress コアが意外とタフなのはコレ。
-
zstd / brotli って何?
-
Google 謹製の Brotli、Facebook 発の Zstandard。gzip より圧縮率↑&展開速い。標準じゃないと PECL 拡張頼り+環境差異地獄 が発生する。
-
false が入った変数に配列アクセスって何でやるの?
-
$row = db_fetch();
が失敗して false → なのに['col']
を書いちゃう事故。昔は Warning で流れてたから潜伏バグになってた。
-
PHP9 が型厳密って言っても TypeScript ほどじゃないよね?
-
Yes。PHP はランタイム型チェック主体。TS はコンパイル時+構造的型。Generics もまだ RFC 段階。なので “よりマシ” になるだけで TS レベルの保証までは行かない
-
PHP で async すると何が嬉しい?
-
I/O 待ち(HTTP, DB, Redis…)を
await
でノンブロック化 → 同一プロセスで並行タスクが回せる。FaaS やチャットボットで レスポンス短縮 / スループット向上 が見込める。
コメントを残す