PHP 8.5 で変わったこと

PHP 8.5
PHP 8.4は、2025年(令和7年)11月20日に正式版がリリースされた。
「より賢く、より速く、未来に備えて」をキャッチフレーズに、パイプ演算子を導入し、定数式にクロージャが利用できるようになり、また、致命的エラーがバックトレースを表示するようになるなど、より安定性の高い言語へと進化している。
👉公式ダウンロードサイト

目次

PHPコアの新機能

パイプ演算子
パイプ演算子(|>)をサポート。「⁠ネストされた呼び出し」を記述することなく関数呼び出しを連結することができ、中間変数を介さずに複数の関数に値をスムーズに渡すことができる。
定数式にクロージャ
静的クロージャとファーストクラス呼び出し可能オブジェクトを定数式でも使用できるようになった。これには属性パラメータ、プロパティとパラメータのデフォルト値、および定数が含まれる。
#[\NoDiscard] アトリビュート
関数に#[\NoDiscard]属性を追加すると、PHPは戻り値が使われているかどうかを確認し、使われていない場合は警告が出される。これにより重要な戻り値の利用の見逃しを防ぎ、APIの安全性が向上する。
#[\DelayedTargetValidation] アトリビュート
アトリビュートのコンパイル時エラーを、実行時エラーに変更するアトリビュート#[\DelayedTargetValidation]を導入した。
プロパティに対する #[\Override] 指定
PHP8.3 で Overrideアトリビュートが導入されたが、プロパティには未対応だった。当時はプロパティに設定する意味が全くなかったからだが、その後抽象クラスにプロパティを書けるようになったり、プロパティフックを書けるようになったりしたので、プロパティにもOverrideを付ける意味がでてきた。
static プロパティに対する、非対称可視性の指定
PHP8.4 でプロパティの非対応可視性が導入されたが、静的プロパティには非対応だった。当時は実装が困難だから諦めたそうだが、今回、容易な実装方法が見つかったという。
Fatal Error 発生時のバックトレース
致命的エラーがバックトレースを表示するようになった。
final プロパティと、コンストラクタのプロモーション
PHP8.0 でコンストラクタ引数昇格が導入され、PHP8.4 で finalプロパティが導入された。しかしfinalプロパティは何故かコンストラクタ引数昇格に対応しておらず、今回導入された。

それ以外の主な新機能

cURL
複数のリクエストにまたがって持続する CurlSharePersistentHandle のサポートが追加された。これを使うと、より効率的な接続の再利用が安全にできるようになる。
EXIF
HEIF/HEIC がサポートされた。
Session
session_set_cookie_params(), session_get_cookie_params(), session_start() 関数は、 "partitioned" というキー経由で、 パーティショニングされた Cookie をサポートした。
Standard
getimagesize() が、HEIF/HEIC 画像をサポートした。
libxml 拡張モジュールがロードされている場合に、 getimagesize() は SVG 画像もサポートするようになった。 同様に、image_type_to_extension() と image_type_to_mime_type() も、 IMAGETYPE_SVG を処理するようになった。
getimagesize() が返す配列に、"width_unit" と "height_unit" の 2つエントリが追加された。
URI
RFC 3986 と WHATWG URL に従い、 URI と URL を処理するのに使える拡張モジュールが追加された。 これは、常に有効になっている。

下位互換性のない主な変更点

比較できないオブジェクトと == で比較する
比較できないオブジェクト (例: 列挙型, CurlHandle, その他の内部クラス) を boolean と比較した場合の振る舞いは、 以前のバージョンでは一貫性がなかった。 boolean リテラルと $object == true のように比較した場合、(bool)$object と同じ振る舞いをしていた。 静的に不明な値と $object == $true のように比較した場合、常に false を返していた。 これらの振る舞いが、常に (bool)$object に従うように統一された。
gc_collect_cycles の戻り値
gc_collect_cycles() の戻り値には、 間接的に収集されたリソースや文字列が含まれなくなった。
final 指定のサブクラスでの static キーワードの置き換え
final を指定したサブクラスにおける、 メソッドの戻り値 static は、 self または具象クラスに置き換えられるようになった。
コンパイル中やクラスのリンク中に発生したエラー
コンパイル中やクラスのリンク中に発生したエラーは、 常に処理が遅延されるようになった。
キャスト関連の警告
浮動小数点数(または浮動小数点数のように見える文字列) を int 型にキャストする際、 それらが int 型として表現できない場合に警告が発生するようになった。 これは明示的な int キャストと暗黙的な int キャストの両方に影響する。
非推奨:キャスト double, real
キャスト double, real は非推奨となり、float へ統一された。
非推奨:httpサーバ経由の $_SERVER['argv']
でhttpサーバ経由の $_SERVER['argv'] は非推奨となり、"php.ini" で設定を "register_argc_argv = Off" にすること。
非推奨:imagedestroy, curl_close
PHP 8.5で imagedestroy, curl_close 関数は非推奨になった。

その他の注意点

文字エンコードの 'auto' 判定
mb_convert_encoding 関数などで、変換元の文字エンコードを自動判断する 'auto' の判定が、PHP 8.4より劣っている(環境に依存するかもしれない)。代替策としては、下記のように変換元エンコードの優先順位を配列で指定してやる。
$encodings = ['UTF-8', 'SJIS', 'EUC-JP'];
$utf8 = mb_convert_encoding($text, 'UTF-8', $encodings);

参考サイト

(この項おわり)
header