"array" と "callable" を使う
class_alias() では、
クラスのエイリアス名として、"array"
と "callable" を指定できなくなりました。
比較できないオブジェクト
(例: 列挙型, CurlHandle,
その他の内部クラス) を boolean と比較した場合の振る舞いは、
以前のバージョンでは一貫性がありませんでした。
boolean リテラルと $object == true
のように比較した場合、(bool)$object
と同じ振る舞いをしていました。
静的に不明な値と $object == $true
のように比較した場合、常に false を返していました。
これらの振る舞いが、常に (bool)$object
に従うように統一されました。
gc_collect_cycles() の戻り値には、 間接的に収集されたリソースや文字列が含まれなくなりました。
final を指定したサブクラスにおける、 メソッドの戻り値 static は、 self または具象クラスに置き換えられるようになりました。
tick ハンドラは、 すべてのシャットダウン関数とデストラクタが実行され、 出力ハンドラがクリーンアップされた後に、 無効化されるようになりました。
トレイトは、親クラスの前にバインドされるようになりました。 これは微妙な振る舞いの変更ですが、 ユーザーの期待により一致するはずです。
コンパイル中やクラスのリンク中に発生したエラーは、 常に処理が遅延されるようになりました。 これらのエラーは、コンパイルまたはクラスのリンク後に処理されます。 コンパイル中やクラスのリンク中に致命的なエラーが発生した場合、 遅延させられていたエラーがすぐに処理されます。 この場合、ユーザー定義のエラーハンドラを呼び出しません。
クラスのリンク処理時に、 ユーザー定義のエラーハンドラからスローされた例外は、 致命的なエラーに昇格しなくなり、リンクを妨げなくなりました。
抽象クラス、列挙型、インターフェース、
またはトレイトに #[\Attribute] を適用すると、
コンパイル時にエラーが発生します。
以前のバージョンではアトリビュートを追加できていましたが、
ReflectionAttribute::newInstance()
がコールされた際に Error がスローされていました。
新しい #[\DelayedTargetValidation] アトリビュートを使うと、
このエラーをコンパイル時から実行時に遅延させることできます。
さまざまな PHP エンジンの想定を壊してしまうため、 disable_classes INI ディレティブは削除されました。
$block_size に 1 から 9 の間以外の値を指定した場合、
bzcompress() は ValueError
をスローするようになりました。
$work_factor に 0 から 250 の間以外の値を指定した場合、
bzcompress() は ValueError
をスローするようになりました。
DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection, Dom\DtdNamedNodeMap を clone すると、 失敗するようになりました。 この変更で、動作しているオブジェクトが実際に失敗することはありません。 よって、実際の影響はゼロのはずです。
$filename に nul バイトが含まれている場合、
finfo_file() と
finfo::file() は、
TypeError ではなく
ValueError をスローするようになりました。
これにより、スローされるエラーの型が、
言語の他の動作と一貫性を保つように調整されます。
この拡張モジュールは、ICU 57.1 以降が必須になりました。
クラスが初期化されていなかったり、 clone が失敗した場合に、 IntlDateFormatter::setTimeZone()/datefmt_set_timezone() は IntlException をスローするようになりました。
Locale クラスの全てのメソッドは、 ロケールの引数に null バイトが含まれていた場合に ValueError をスローするようになりました。
数値形式の文字列の処理に関する
Collator::SORT_REGULAR の動作が、
ext/standard の SORT_REGULAR
の動作と同じになるように調整されました。
不正なオプションを渡した場合、 ldap_get_option() と ldap_set_option() は ValueError をスローするようになりました。
Unicode データテーブルが、Unicode 17.0 に更新されました。
既に構築済みのオブジェクトに対して、 mysqli のコンストラクタをコールすることはできなくなりました。 コールした場合、Error がスローされます。
ODBC は、最低でも ODBC 3.5 の機能が使えると想定するようになりました。 ODBCVER の定義や、それを制御するビルドシステムフラグは削除されました。
ODBC は、 特定のドライバ向けにビルドするためのビルドフラグを(DB2以外に) 持たなくなり、 それらのドライバ向けの特別なケースも削除されました。 Windows 以外の環境では、 iODBC や unixODBC のようなドライバマネージャの使用を強く推奨します。
Opcache 拡張モジュールは、 常に PHP バイナリに組み込まれ、ロードされるようになりました。 opcache.enable と opcache.enable_cli の設定はまだ有効です。
--enable-opcache/--disable-opcache configure オプションは削除され、 ビルドしても opcache.so や php_opcache.dll はもはや生成されません。
zend_extension=opcache.so や
zend_extension=php_opcache.dll
INI 設定を使うと、警告が発生するようになりました。
pcntl_exec() の
$args パラメータのエントリに、
null バイトが含まれていた場合、
ValueError がスローされるようになりました。
pcntl_exec() の
$env_vars パラメータのエントリまたはキーに、
null バイトが含まれていた場合、
ValueError がスローされるようになりました。
semi-deprecated 扱いになっていた、 コンパイルオプション PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK 抜きでビルドされるようになりました。
PDO::FETCH_CLASS
と組み合わせて設定されるコンストラクタ引数は、
通常の CUFA (call_user_func_array())
の規約に従うようになりました。
つまり、文字列のキーは名前付き引数のように振る舞うということです。
さらに、リファレンス渡しのパラメータに渡される、
値渡し引数の自動ラップが廃止され、
通常の E_WARNING が発生するようになりました。
コンストラクタ引数に変数をリファレンス渡しするには、
配列の値にリファレンスの値を代入します: $ctor_args = [&$valByRef]
PDO::fetch(), PDO::fetchObject(), PDO::fetchAll() の呼び出し中に、 PDOStatement::setFetchMode() を呼び出そうとすると、 Error がスローされるようになりました。 これはたとえば、 オブジェクトのフェッチ中に Statement オブジェクトをコンストラクタの引数として渡す際に、 PDOStatement::setFetchMode() を呼び出す場合が該当します。
定数 PDO::FETCH_GROUP,
PDO::FETCH_UNIQUE,
PDO::FETCH_CLASSTYPE,
PDO::FETCH_PROPS_LATE,
PDO::FETCH_SERIALIZE の値が変更されました。
PDO::FETCH_PROPS_LATE
が PDO::FETCH_CLASS
以外のフェッチモードと一緒に使われた場合、
ValueError がスローされるようになりました。
これは、他のフェッチフラグの動作と一貫性を持たせるためです。
PDO::fetchAll() で、
PDO::FETCH_INTO をフェッチモードとして使おうとすると、
PDO::FETCH_LAZY
と同様に ValueError がスローされるようになりました。
Firebird ドライバが生成した PDOStatement に対して、長過ぎるカーソル名を設定しようとすると、 ValueError がスローされるようになりました。
SQLite の PDO::quote() は、 文字列に null バイトが含まれていた場合に、 エラーモードに応じて警告を発生させたり、例外をスローするようになりました。
PDO::sqliteCreateCollation() は、 コールバック関数の戻り値の型が間違っている場合に、 例外をスローするようになりました。 この変更によって、 Pdo\Sqlite::createCollation() の動作とより一致するようになります。
posix_kill() は、 process_id 引数がプラットフォームがサポートする範囲 (符号付きまたは long)より小さいか大きい場合に ValueError をスローするようになりました。 posix_setpgid() は、 process_id または process_group_id が 0 未満、 またはプラットフォームがサポートする範囲より大きい場合に ValueError をスローするようになりました。
posix_setrlimit() は、 hard_limit または soft_limit 引数が -1 より小さい場合、 または soft_limit が hard_limit より大きい場合に ValueError をスローします。
無効なターゲットにアトリビュートが適用された場合、 ReflectionAttribute::newInstance() は、 内部的なアトリビュート向けに例外をスローするようになりました。 #[\DelayedTargetValidation] を使うと、 発生するエラーがコンパイル時から実行時に遅延されます。
パイプ文字 (|)
が含まれたキーを持つ $_SESSION
にセッションデータを書き込もうとすると、
黙って失敗するのではなく、警告が発生するようになりました。
session_start() は、 オプション引数をより厳格に扱うようになりました。 配列が連想配列でない場合、 ValueError がスローされるようになりました。 read_and_close の値が int と互換性のない値の場合、 TypeError がスローされるようになりました。
ノードの集合以外を返す XPath 式を
SimpleXMLElement::xpath()
に渡した場合、警告が発生し、false を返すようになりました。
これより前のバージョンでは、黙って失敗し、
空の配列を返していました。
snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() SNMP::__construct() は、 ValueError をスローするようになりました。 スローされるのは、ホスト名が長すぎたり、 ホスト名が null バイトを含んでいたり、 負の値や 65535 を超えるポート番号を指定したり、 タイムアウトやリトライの値が -1 より小さかったり、大きすぎたりする場合です。
SoapClient::__doRequest() に、
オプションの $uriParserClass
パラメータが新しく追加されました。
これは、文字列と null を受け入れます。
null を渡すと、オリジナルの parse_url()
ベースのメソッドになります。
Uri\Rfc3986\Uri や
Uri\WhatWg\Url を渡すと、
新しいバックエンドを使います。
socket_create_listen(), socket_bind(), socket_sendto() は、 ポートが 0 未満または 65535 を超える場合、 または hints 配列のエントリが数値インデックスの場合に、 ValueError をスローするようになりました。
socket_addrinfo_lookup() は、 hints 値のいずれかが int 型にキャストできない場合に、 TypeError をスローするようになりました。 また、これらの値のいずれかがオーバーフローした場合、 ValueError をスローする可能性があります。
socket_set_option() 関数で
MCAST_LEAVE_GROUP/MCAST_LEAVE_SOURCE_GROUP を指定した場合、
値が有効なオブジェクトまたは配列でない場合は例外がスローされるようになりました。
socket_set_option()
をマルチキャストコンテキストで呼び出す場合、
作成されたソケットが
AF_INET/AF_INET6
ファミリでない場合、ValueError がスローされるようになりました。
ArrayObject は 列挙型を受け入れなくなりました。 列挙型の $name や $value プロパティが、PHP エンジンの想定を壊す可能性があるからです。
SplFileObject::fwrite() の
$length パラメータは、nullable になりました。
デフォルト値が 0 から null に変更されています。
printf ファミリの関数に精度を指定しないフォーマットを使った場合、 精度を 0 として扱うようになりました。 これより前のバージョンでは、誤って精度をリセットしていました。
tidy::__construct(), tidy::parseFile(), tidy::parseString() は、 無効な設定値が含まれていたり、 読み取り専用の内部エントリを設定しようとした場合に ValueError をスローするようになりました。 設定キーが文字列でない場合は、 TypeError がスローされるようになっています。