コールスタックがオーバーフローしそうになっているプログラムは、zend.max_allowed_stack_size - zend.reserved_stack_size (ファイバーの場合は fiber.stack_size - zend.reserved_stack_size) バイト以上のスタックを使い切った時点で Error をスローするようになりました。
proc_get_status() を複数回コールした場合、POSIX システムでは常に正しい値を返すようになりました。これより前のバージョンでは、最初の呼び出しの場合にだけ正しい値を返していました。proc_get_status() をコールしたあとに proc_close() を呼び出した場合も、正しい終了コードを返すようになりました。これより前のバージョンでは、-1 を返していました。内部的に、この処理は POSIX システム上で結果の値をキャッシュすることで実現しています。以前の振る舞いを望む場合は、proc_get_status() が返す配列の "cached" キーをチェックすることで、結果がキャッシュされているかを確認できます。
実行時間の最大秒数を制御するタイマーが、Linux 上で ZTS を有効にしてビルドした場合でもデフォルトで有効になりました。
static プロパティと一緒にトレイトを使うと、親クラスから継承する static プロパティを再宣言するようになりました。つまり、現在のクラスのために別の static プロパティを作成するということです。これは、トレイトを使わずに直接 static プロパティを追加する操作に似ています。
空の配列に負のインデックス $n を割り当てた場合、その次のインデックスは 0 ではなく、必ず $n+1 になります。
クラス定数のアクセス権の変性が、インターフェイスから継承した場合でも正しくチェックされるようになりました。
WeakMap のエントリには、(場合によっては推移的に) キーが自分自身を参照しているものがあります。そのキーが、WeakMap をループする以外の方法では到達できない場合 (ループ経由での到達は、weak と見なされます)、循環参照の収集時にそれを削除できるようになりました。これより前のバージョンでは、こうしたエントリは自動で決して削除されませんでした。
日付・時刻の拡張モジュールでは、DateError と DateException の階層に、拡張モジュール特有の例外とエラーを追加しました。これは、エラー時に警告や汎用の例外を発生させていた動作を置き換えるものです。これによって、エラーハンドリングが改善されますが、その代わりにエラーや例外をチェックする必要があります。
親が存在しないノード上で DOMChildNode::after(), DOMChildNode::before(), DOMChildNode::replaceWith() をコールしても、親子関係に関する例外をスローせず、何もしなくなりました。これは DOM の仕様が要求している振る舞いです。
ドキュメントノードが存在しない状態で DOMParentNode と DOMChildNode のメソッドを使うと、DOM_HIERARCHY_REQUEST_ERR DOMException をスローせず、エラーなしで動作するようになりました。これはDOMの仕様が要求している振る舞いです。
prefix を指定せずに DOMDocument::createAttributeNS() をコールすると、デフォルトの名前空間を誤って作成し、その名前空間中に属性ではなく要素を置いていました。PHP 8.3 では、このバグが修正されています。
以前のバージョンでは、DOMDocument::createAttributeNS() は、prefix が既に異なる URI で使われている場合に誤って DOM_NAMESPACE_ERRNAMESPACE_ERR DOMException をスローしていました。
このバージョンからは、prefix の名前が衝突していた場合でも、異なる prefix を正しく選べるようになりました。
新しいメソッドやプロパティが DOM クラスに追加されました。ユーザー定義のクラスがこれらを継承し、メソッドやプロパティを親クラスのものと同じ名前で宣言した場合、それらの宣言には互換性がなければいけません。互換性がない宣言の場合、それを指摘するコンパイルエラーがスローされることになります。新しく実装されたメソッドやプロパティについては、新機能 のセクションと 新しく追加された関数 を参照ください。
INI ディレクティブ opcache.consistency_checks が削除されました。この機能は tracing JIT や、inheritance cache (継承関係をキャッシュする機能) と一緒に使った場合に壊れてしまっていました。その後、このディレクティブを有効にする方法が見つからないまま、PHP 8.1.18 と 8.2.5 で無効にされました。tracing JIT と inheritance cache は両方、スクリプトが永続化された後に共有メモリを変更し、そのチェックサムを無効にする可能性があります。変更されうるポインタをスキップする変更も試みられましたが、複雑過ぎて受け入れられませんでした。以上の理由から、壊れてしまうバグを修正するのではなく、ディレクティブそのものが削除されることになりました。
Phar クラスの定数の型が、宣言されるようになりました。
range() 関数に対して、さまざまな変更が加えられました:
step に 0 を渡すと、よりわかりやすい ValueError がスローされるようになりました。step に負の値を渡すと、ValueError がスローされるようになりました。step が整数型として解釈できる float の場合、整数型として解釈するようになりました。start や end が空文字列の場合、E_WARNING が発生するようになりました。値そのものが 0 にキャストされる動作は変更されていません。start や end が1バイトより長い場合、E_WARNING が発生するようになりました。但し、それが数値形式の文字列でない場合に限ります。start や end が整数型にキャストされる場合、E_WARNING が発生するようになりました。なぜなら、他の境界の入力値は数値だからです。(例: range(5, 'z');)step が float だった場合、E_WARNING が発生するようになりました。但し、境界の値がともに数値形式の文字列の場合を除きます。(例: range('5', '9', 0.5); のようなコードは、警告が発生しません)range('9', 'A');)<?php
range('9', 'A'); // PHP 8.3.0 以降は、["9", ":", ";", "<", "=", ">", "?", "@", "A"]
range('9', 'A'); // PHP 8.3.0 より前は、[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
?>
number_format() は、decimals
に負の値を指定した場合、num を小数点より前の
abs($decimals) 桁に丸めることで対応するようになりました。
これより前のバージョンでは、負の decimals
は黙って無視されていました。
file() 関数の flags パラメータのエラーチェックが、すべての不正なフラグを検出するようになりました。注意すべきなのは、これより前のバージョンでは FILE_APPEND を黙って受け入れていましたが、このバージョンから受け入れなくなったことです。
SNMP クラスの定数の型が、宣言されるようになりました。