## その他の変更

### PHP コア

#### クロージャ

クロージャの名前が調整され、親関数の名前と 定義の行番号を含むようになりました。これにより、 スタックトレース内などでの識別が容易になります。

#### ファイバー(Fibers)

デストラクタ実行中にファイバーを切り替えられるようになりました。 以前はガベージコレクションとの競合のためブロックされていました。

デストラクタは別のファイバー内で実行される場合があります。

ガベージコレクションがファイバー内でトリガーされると、 GC によって呼び出されるデストラクタは 別のファイバー(gc_destructor_fiber)内で実行されます。 このファイバーが中断された場合、残りのデストラクタを実行するために 新しいファイバーが作成されます。 以前の gc_destructor_fiber は GC によって参照されなくなり、 他に参照されていなければ回収される可能性があります。 デストラクタが中断されたオブジェクトは、 デストラクタが戻るか Fiber が回収されるまで回収されません。

#### 出力ハンドラ

ob_start() の `flags` パラメータに渡された 出力ハンドラのステータスフラグがクリアされるようになりました。

output_add_rewrite_var() は、 リライトされるホストを選択するために `url_rewriter.hosts` を使用するようになりました。 以前は `session.trans_sid_hosts` を使用していました。

### SAPI モジュールへの変更

#### apache2handler

EOLを迎えた Apache 2.0 および 2.2 のサポートが削除されました。 最小必要 Apache バージョンは 2.4 になりました。

#### CLI

組み込みサーバーは、指定されたファイルが見つからない場合、 親ディレクトリをたどってインデックスファイルを再帰的に探します。 このプロセスは、パスがファイルを指しているように見える場合 （最後のパスコンポーネントにピリオドが含まれる場合）はスキップされていました。 その場合、404 エラーが返されていました。 この動作は、すべての場合にインデックスファイルを探すように変更されました。

#### FPM

本文なしでヘッダをフラッシュできるようになりました。

ステータスページにメモリの最大使用量を表示するフィールドが追加されました。

Solaris/Illumos 用の /dev/poll `events.mechanism` 設定は廃止されました。

### 変更された関数

#### PHP コア

trigger_error() および user_error() は、戻り値の型が bool ではなく true になりました。

#### DOM

DOMDocument::registerNodeClass() は、戻り値の型が bool ではなく true になりました。 実際には常に `true` を返すことしかできませんでした。

#### Hash

hash_update() は、戻り値の型が bool ではなく true になりました。 実際には常に `true` を返すことしかできませんでした。

#### Intl

`NumberFormatter::ROUND_TOWARD_ZERO` および `NumberFormatter::ROUND_AWAY_FROM_ZERO` が、新しい `PHP_ROUND_*` モードと一致するように、 `NumberFormatter::ROUND_DOWN` および `NumberFormatter::ROUND_UP` のエイリアスとして追加されました。

ResourceBundle::get() は、戻り値の型が `ResourceBundle|array|string|int|null` になりました。

idn_to_ascii() および idn_to_utf8() 関数は、`domain` 名が空または長すぎる場合、 ValueError をスローするようになりました。

idn_to_ascii() および idn_to_utf8() 関数は、`variant` パラメータが `INTL_IDNA_VARIANT_UTS46` でない場合、 ValueError をスローするようになりました。

#### LibXML

libxml_set_streams_context() は、 非ストリームコンテキストリソースが関数に渡された場合、 ストリームコンテキストが使用されるときではなく、 直ちに TypeError をスローするようになりました。

#### MBString

mb_strcut() の動作は、 無効な UTF-8 および UTF-16 文字列に対してより一貫性のあるものになりました。 有効な UTF-8 および UTF-16 文字列に対する動作の変更はありません。

#### ODBC

odbc_fetch_object()、 odbc_fetch_array()、および odbc_fetch_into() の `row` は、デフォルト値が `null` になり、 odbc_fetch_row() と一致するようになりました。 以前は、それぞれデフォルト値が `-1`、 `-1`、 `0` でした。

#### OpenSSL

openssl_csr_new() の `extra_attributes` は、 CSR 属性を設定します。 以前はサブジェクト DN が誤って設定されていました。

openssl_csr_new() の `dn` は、 単一のエントリに対して値の array を設定できるようになりました。

openssl_csr_sign() に新たに `serial_hex` が追加され、 16 進形式でシリアル番号を設定できるようになりました。

openssl_x509_parse() で ASN.1 UTCTime を解析する際、 OpenSSL バージョン 3.2 未満では秒が省略されていると失敗します (そのようなフィールドでは `-1` が返されます)。 OpenSSL バージョン 3.3 以降では、そのような証明書は読み込むことができません。

#### PDO

PDO::getAttribute() で `PDO::ATTR_STRINGIFY_FETCHES` 属性の値を取得できるようになりました。

`PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE` が追加されました。 サポートされているドライバで PDO::getAttribute() を使用して クエリ結果のメモリ使用量を取得できるようになりました。

#### PDO_FIREBIRD

PDO::getAttribute() で `FB_ATTR_DATE_FORMAT`、 `FB_ATTR_TIME_FORMAT`、 `FB_ATTR_TIMESTAMP_FORMAT` 属性の値を取得できるようになりました。

トランザクションの分離レベルとアクセスモードを指定するための新しい属性が追加されました。 この機能のため 5 つの定数が追加されました:

- `Pdo\Firebird::TRANSACTION_ISOLATION_LEVEL`
- `Pdo\Firebird::READ_COMMITTED`
- `Pdo\Firebird::REPEATABLE_READ`
- `Pdo\Firebird::SERIALIZABLE`
- `Pdo\Firebird::WRITABLE_TRANSACTION`

永続的な接続を使用する場合、コンストラクタ内での生存チェックが追加されました。

ビルドされる内容は、 ibase.h 内の `FB_API_VER` の値によって変わります。 この情報を取得するために新しい static メソッド Pdo\Firebird::getApiVersion() が追加されました。 この情報は phpinfo() からも参照できます。

5 つの新しいデータ型が利用可能になりました: `INT128`, `DEC16`, `DEC34`, `TIMESTAMP_TZ`, `TIME_TZ` これらは Firebird 4.0 以降で利用可能です。

#### PDO_MYSQL

PDO::getAttribute() で `PDO::ATTR_FETCH_TABLE_NAMES` 属性の 値を取得できるようになりました。

#### PDO_PGSQL

`PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE` によるクエリのメモリ使用量の取得をサポートしました。

カラムが `FLOAT4OID` または `FLOAT8OID` 型の場合、値は string ではなく float として返されるようになりました。

#### PGSQL

pg_select() の `conditions` パラメータ はオプションになり、空の配列を受け入れるようになりました。

#### Phar

Phar::setAlias(), Phar::setDefaultStub() は、戻り値の型が bool ではなく true になりました。

#### POSIX

posix_isatty() は、 ファイル記述子/ストリーム引数が無効な場合エラー番号を設定するようになりました。

#### Reflection

ReflectionGenerator::getFunction() は、ジェネレータの実行が終了した後でも呼び出すことができるようになりました。

#### Sockets

socket_create_listen() の `backlog` パラメータのデフォルト値は `SOMAXCONN` になりました。 以前は `128` でした。

#### Sodium

sodium_crypto_aead_aes256gcm_* 関数は、ARM 暗号化拡張を持つ aarch64 CPU で 利用可能になりました。

#### SPL

SplPriorityQueue::insert(), SplPriorityQueue::recoverFromCorruption(), SplHeap::insert(), SplHeap::recoverFromCorruption() メソッドは、戻り値の型が bool ではなく true になりました。

SplObjectStorage は SeekableIterator を実装するようになりました。

#### Standard

password_hash() で指定できる `PASSWORD_BCRYPT` ハッシュアルゴリズムの デフォルトの `'cost'` 値が `10` から `12` に引き上げられました。

debug_zval_dump() は、配列がパックされているかどうかを示すようになりました。

long2ip() は、戻り値の型が `string|false` ではなく string になりました。

highlight_string() は、戻り値の型が `string|bool` ではなくstring|true になりました。

print_r() は、戻り値の型が `string|bool` ではなく string|true になりました。

##### round() による丸め処理

round() 関数の `mode` パラメータは、 `RoundingMode|int` に拡張され、 新たに追加された RoundingMode 列挙型のインスタンスを受け入れます。

round() 関数に 4 つの新しいモードが追加されました: RoundingMode::PositiveInfinity, RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero

整数への丸めのための内部実装が、正確さの検証と メンテナンスの容易さのために書き直されました。 その結果、いくつかの丸め処理のバグが修正されました。 例えば、以前は `0.49999999999999994`を最も近い整数に丸めると、 正しい結果の `0.0` ではなく `1.0` になっていました。 他の入力も影響を受け、以前の PHP バージョンと比較して 異なる出力になる場合があります。

round() 関数の「事前丸め」によるバグが修正されました。 以前は、「事前丸め」により `0.285` (実際には `0.28499999999999998`)のような値を 10 進数として、`0.29` に丸めていました。 しかし、「事前丸め」は特定の数値を誤って丸めるため、 この修正では「事前丸め」を削除し、値同士の比較方法を変更することで、 値が 10 進数として正しく丸められるようにしました。

round() が処理できる最大精度が 1桁増えました。 例えば、`round(4503599627370495.5)` は以前は `4503599627370495.5` を返していましたが、 現在は `4503599627370496` を返します。

### 拡張モジュールへのその他の変更

#### cURL

最小必要 libcurl バージョンは 7.61.0 になりました。

`CURLOPT_DNS_USE_GLOBAL_CACHE` オプションは もはや効果がなく、通知なく無視されます。 この基本機能は libcurl 7.11.1 で非推奨となり、 libcurl 7.62.0 で削除されました。

#### GMP

GMP オブジェクトを bool に キャストできるようになりました。以前は `E_RECOVERABLE_ERROR` が発生していました。 キャストの動作はオーバーロードされ、値が `0` を表す GMP オブジェクトは `false` にキャストされます。

#### LibXML

最小必要 libxml2 バージョンは 2.9.4 になりました。

#### Intl

Intl クラスの動作が統一され、 初期化されていないオブジェクトを使用しようとした場合やクローンに失敗した場合に、 Error 例外をスローするようになりました。

#### MBString

Unicode データテーブルが Unicode 16.0 に更新されました。

#### MySQLnd

MySQL 9 の新しい VECTOR データ型のサポート。

#### OpenSSL

最小必要 OpenSSL バージョンは 1.1.1 になりました。

#### PDO_PGSQL

最小必要 libpq バージョンは 10.0 になりました。

#### PGSQL

最小必要 libpq バージョンは 10.0 になりました。

#### SPL

SplFixedArray での範囲外アクセスは、 RuntimeException ではなく OutOfBoundsException 型の例外をスローするようになりました。 OutOfBoundsException は RuntimeException の子クラスであるため、 これらの例外をキャッチしようとする際の動作に変更はありません。

#### XSL

型付きプロパティ XSLTProcessor::$cloneDocument および XSLTProcessor::$doXInclude が定義されました。

#### Zlib

最小必要 zlib バージョンは 1.2.11 になりました。

### パフォーマンス

#### PHP コア

ZTS ビルドにおける高負荷の並行処理環境下で、 浮動小数点数の解析とフォーマットのパフォーマンスが向上しました。 これは printf() 系の関数や json_encode()、serialize() などのシリアライズ関数に影響します。

`%s` と `%d` 指定子のみを使用する sprintf() は、同等の文字列補間にコンパイルされ、 関数呼び出しのオーバーヘッドとフォーマット文字列の 繰り返し解析を回避します。

#### BCMath

数値の変換と演算のパフォーマンスが向上しました。

#### DOM

DOMNode::C14N() のパフォーマンスが、 xpath クエリなしの場合に大幅に向上しました。 これは数万ノードのドキュメントで簡単に 2 桁の 時間改善をもたらします。

XML シリアライズのパフォーマンスが向上し、メモリ消費が削減されました。

ノードクラスのメモリ使用量が削減されました。

#### FTP

大きなアップロードで FTP アップロードのパフォーマンスが 最大 10 倍向上しました。

#### Hash

SHA-256 の SSE2 および SHA-NI 実装が追加されました。 これにより、サポートされている CPU でのパフォーマンスが SSE2 で最大 1.3 倍、 SHA-NIで 3から 5 倍向上します。 この最適化は Colin Percival / Tarsnap の功績です。

#### MBString

mb_strcut() は UTF-8 および UTF-16 文字列で大幅に高速になりました。

mbstring のエンコーディング名の検索が大幅に高速になりました。

SJIS-win から Unicode への変換のパフォーマンスが大幅に向上しました。

#### MySQLnd

MySQLnd のクオートのパフォーマンスが向上しました。

#### PCRE

名前付きキャプチャグループのパフォーマンスが向上しました。

#### Random

Random\Randomizer のパフォーマンスが向上しました。 特に Random\Randomizer::getBytes() と Random\Randomizer::getBytesFromString() メソッドで顕著です。

#### SimpleXML

XML シリアライズのパフォーマンスが向上し、メモリ消費が削減されました。

#### Standard

strspn() および strcspn() の パフォーマンスが大幅に向上しました。 二乗時間ではなく、線形時間で実行されるようになりました。

strpbrk() のパフォーマンスが向上しました。

get_browser() は大幅に高速になり、 いくつかのテストケースで最大 1.5 倍から 2.5 倍の速度向上を実現しました。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open