PHP 8.4 で変わったこと

PHP 8.4
PHP 8.4は、2024年(令和6年)11月21日に正式版がリリースされた。プロパティフック、遅延オブジェクト、非対称可視性、BCMath のオブジェクトAPI、新しい配列関数、その他のさまざまな新しい関数や言語機能など、多数の新機能が搭載された。また。IRフレームワークに基づく新しい JIT 実装も導入され、さまざまなパフォーマンス改善が行われている。
👉公式ダウンロードサイト

目次

PHPコアの新機能

プロパティフック
PHPのオブジェクト指向プログラミング(OOP)における、「ゲッター(getter)」と「セッター(setter)」の扱いに全く新しいアプローチを導入し、クラスファイルの構造を単純化することを可能にする。オブジェクトのプロパティは、 get および set 操作に 追加のロジックを関連付けることができるようになった。 使用方法に応じてそのプロパティは、値を持つ場合もあるし、 仮想的、つまり値を持たない場合もある。
非対称可視性プロパティ
アクセスされるコンテキストによって、プロパティの可視性のレベルを変更することができるようになった。つまり、あるプロパティが読み込まれるときには public でも、設定時には private または protected にすることができる。
レイジーオブジェクト
アクセスされるまで初期化が延期されるオブジェクトを作成できるようになった。 ライブラリやフレームワークは、これらのレイジーオブジェクトを利用して、初期化に必要なデータや依存関係の取得を遅延させることができる。
#[\Deprecated] アトリビュート
新しい Deprecated 属性を使用し、関数、メソッド、 およびクラス定数を非推奨としてマークできる。このアトリビュートで非推奨となった機能の動作は、 PHP 自身が提供する既存の非推奨メカニズムの動作と一致する。唯一の例外は、発生するエラーコードが E_DEPRECATED ではなく E_USER_DEPRECATED であることだ。
POST 以外の HTTP リクエストでの RFC1867 (マルチパート)リクエストの解析
POST 以外の HTTP リクエストで RFC1867(マルチパート)リクエストを解析するための request_parse_body() 関数が追加された。
括弧なしでの new 式のチェーン
コンストラクタ引数を持つ new 式は直接参照できるようになり、 式を括弧で囲むことなくメソッド呼び出しや プロパティアクセスなどのチェーンが可能になった。
WeakReference のデバッグ情報の改善
WeakReference のデバッグ情報を取得すると、 参照しているオブジェクト、または参照が無効になっている場合は null が出力されるようになった。
Closure のデバッグ情報の改善
Closure::__debugInfo() の出力には、 Closure の名前、ファイル名、および行が含まれるようになった。
異なる名前空間ブロックで同一のシンボルを定義
名前空間を終了すると、そこで定義されたシンボルがクリアされるようになった。 これにより、以前の名前空間ブロックで同じ名前のシンボルが宣言されていても、 名前空間ブロック内でシンボルを使用できるようになった。

それ以外の主な新機能

BCMath
新しい BcMath\Number オブジェクトを使うと、任意精度数値をオブジェクト指向で利用したり、通常の算術演算子で計算したりできるようになる。このオブジェクトはイミュータブルで、 Stringable インターフェースを実装しているので echo $num のように文字列の文脈で利用可能だ。また、BcMath が高速化された。
cURL
CURLOPT_HTTP_VERSION のオプションとして、 CURL_HTTP_VERSION_3 および CURL_HTTP_VERSION_3ONLY 定数 (libcurl 7.66 および 7.88 から利用可能) が追加になった。cURL オプションとしてCURLOPT_PREREQFUNCTION が追加され、 接続が確立された後、リクエストが送信される前に呼び出される callable を受け入ることができる。
DOM
HTML5 に対応した DomHTMLDocument クラスが新たに導入された。
OpenSSL
Curve25519 および Curve448 ベースのキーのサポートが追加された。パスワードのハッシュ方法として PASSWORD_ARGON2 が実装された。
PCRE
同梱の pcre2lib がバージョン 10.44 に更新された。
PDO
ドライバ固有のサブクラスのサポートが追加された。
SOAP
クラスマップでの名前空間のクラーク式記法のサポートが追加された。
XSL
シングルクォートとダブルクォートの両方を含むパラメータを使用できるようになった。
MBString
マルチバイトのtrim関数が追加になった。

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

デフォルト引数のnull禁止
PHP7.1 で nullable指定ができるようになり、PHP8.0で非推奨となったもので、今回正式に禁止となった。
副作用があるので仕様には十分注意していただきたいのだが、"error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED)" とすることで、エラー発生を抑止することができる。
exit()
exit() および die() に無効な型を渡すと、一貫して TypeError がスローされるようになった。
比較中の再帰
比較中に再帰が発生すると、 E_ERROR の致命的なエラーの代わりに、 Error 例外がスローされるようになった。
readonly プロパティの間接的な変更
__clone() 内で readonly プロパティを間接的に変更することはできなくなった。
定数の型
PHP_DEBUG および PHP_ZTS 定数の型が、int から bool に変更された。
一時ファイル名の長さ
アップロードされたファイルや tempnam() 関数で作成されるファイルの名前は、 以前より13バイト長くなった。 総合的な長さは引き続きプラットフォーム依存である。
E_STRICT エラーレベルの削除
E_STRICT 定数は非推奨となった。

参考サイト

(この項おわり)
header