その他の変更

PHP コア

クロージャ

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

ファイバー(Fibers)

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

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

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

出力ハンドラ

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

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_objectodbc_fetch_array、および odbc_fetch_intorow は、デフォルト値が null になり、 odbc_fetch_row と一致するようになりました。 以前は、それぞれデフォルト値が -1-10 でした。

OpenSSL

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

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

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

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

PDO

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

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

PDO_FIREBIRD

PDO::getAttributeFB_ATTR_DATE_FORMATFB_ATTR_TIME_FORMATFB_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 の値によって変わります。 この情報を取得するために新しい静的メソッド Pdo\Firebird::getApiVersion が追加されました。 この情報は phpinfo からも参照できます。

5 つの新しいデータ型が利用可能になりました:

  • INT128
  • DEC16
  • DEC34
  • TIMESTAMP_TZ
  • TIME_TZ
これらは Firebird 4.0 以降で利用可能です。

PDO_MYSQL

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

PDO_PGSQL

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

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

PGSQL

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

Phar

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

POSIX

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

Reflection

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

Sockets

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

Sodium

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

SPL

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

SplObjectStorageSeekableIterator を実装するようになりました。

Standard

PASSWORD_BCRYPT ハッシュアルゴリズムの password_hash のデフォルトの '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 型の例外をスローするようになりました。 OutOfBoundsExceptionRuntimeException の子クラスであるため、 これらの例外をキャッチしようとする際の動作に変更はありません。

XSL

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

Zlib

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

パフォーマンス

PHP コア

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

%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::getBytesRandom\Randomizer::getBytesFromString メソッドで顕著です。

SimpleXML

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

Standard

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

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

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