PHP 8.5.0 RC4 available for testing

下位互換性のない変更点

PHP コア

クラスの別名に "array""callable" を使う

class_alias() では、 クラスのエイリアス名として、"array""callable" を指定できなくなりました。

比較できないオブジェクトと == で比較する

比較できないオブジェクト (例: 列挙型, CurlHandle, その他の内部クラス) を boolean と比較した場合の振る舞いは、 以前のバージョンでは一貫性がありませんでした。 boolean リテラルと $object == true のように比較した場合、(bool)$object と同じ振る舞いをしていました。 静的に不明な値と $object == $true のように比較した場合、常に false を返していました。 これらの振る舞いが、常に (bool)$object に従うように統一されました。

gc_collect_cycles の戻り値

gc_collect_cycles() の戻り値には、 間接的に収集されたリソースや文字列が含まれなくなりました。

final 指定のサブクラスでの static キーワードの置き換え

final を指定したサブクラスにおける、 メソッドの戻り値 static は、 self または具象クラスに置き換えられるようになりました。

tick ハンドラ

tick ハンドラは、 すべてのシャットダウン関数とデストラクタが実行され、 出力ハンドラがクリーンアップされた後に、 無効化されるようになりました。

トレイトのバインド

トレイトは、親クラスの前にバインドされるようになりました。 これは微妙な振る舞いの変更ですが、 ユーザーの期待により一致するはずです。

コンパイル中やクラスのリンク中に発生したエラー

コンパイル中やクラスのリンク中に発生したエラーは、 常に処理が遅延されるようになりました。 これらのエラーは、コンパイルまたはクラスのリンク後に処理されます。 コンパイル中やクラスのリンク中に致命的なエラーが発生した場合、 遅延させられていたエラーがすぐに処理されます。 この場合、ユーザー定義のエラーハンドラを呼び出しません。

ユーザー定義のエラーハンドラからスローされた例外

クラスのリンク処理時に、 ユーザー定義のエラーハンドラからスローされた例外は、 致命的なエラーに昇格しなくなり、リンクを妨げなくなりました。

コンパイル中のアトリビュート適用エラー

抽象クラス、列挙型、インターフェース、 またはトレイトに #[\Attribute] を適用すると、 コンパイル時にエラーが発生します。 以前のバージョンではアトリビュートを追加できていましたが、 ReflectionAttribute::newInstance() がコールされた際に Error がスローされていました。 新しい #[\DelayedTargetValidation] アトリビュートを使うと、 このエラーをコンパイル時から実行時に遅延させることできます。

disable_classes INI ディレクティブ

さまざまな PHP エンジンの想定を壊してしまうため、 disable_classes INI ディレティブは削除されました。

配列でない値を分解した場合

配列でない(但し null を除く)値を、 []list() で分解した場合、 警告が発生するようになりました。

Bzip2

$block_size に 1 から 9 の間以外の値を指定した場合、 bzcompress()ValueError をスローするようになりました。

$work_factor に 0 から 250 の間以外の値を指定した場合、 bzcompress()ValueError をスローするようになりました。

DOM

DOMNamedNodeMap, DOMNodeList, Dom\NamedNodeMap, Dom\NodeList, Dom\HTMLCollection, Dom\DtdNamedNodeMap を clone すると、 失敗するようになりました。 この変更で、動作しているオブジェクトが実際に失敗することはありません。 よって、実際の影響はゼロのはずです。

FileInfo

$filename に nul バイトが含まれている場合、 finfo_file()finfo::file() は、 TypeError ではなく ValueError をスローするようになりました。 これにより、スローされるエラーの型が、 言語の他の動作と一貫性を保つように調整されます。

Intl

この拡張モジュールは、ICU 57.1 以降が必須になりました。

クラスが初期化されていなかったり、 clone が失敗した場合に、 IntlDateFormatter::setTimeZone()/datefmt_set_timezone()IntlException をスローするようになりました。

Locale クラスの全てのメソッドは、 ロケールの引数に null バイトが含まれていた場合に ValueError をスローするようになりました。

数値形式の文字列の処理に関する Collator::SORT_REGULAR の動作が、 ext/standard の SORT_REGULAR の動作と同じになるように調整されました。

LDAP

不正なオプションを渡した場合、 ldap_get_option()ldap_set_option()ValueError をスローするようになりました。

MBString

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

MySQLi

既に構築済みのオブジェクトに対して、 mysqli のコンストラクタをコールすることはできなくなりました。 コールした場合、Error がスローされます。

ODBC

ODBC は、最低でも ODBC 3.5 の機能が使えると想定するようになりました。 ODBCVER の定義や、それを制御するビルドシステムフラグは削除されました。

ODBC は、 特定のドライバ向けにビルドするためのビルドフラグを(DB2以外に) 持たなくなり、 それらのドライバ向けの特別なケースも削除されました。 Windows 以外の環境では、 iODBC や unixODBC のようなドライバマネージャの使用を強く推奨します。

Opcache

Opcache 拡張モジュールは、 常に PHP バイナリに組み込まれ、ロードされるようになりました。 opcache.enableopcache.enable_cli の設定はまだ有効です。

--enable-opcache/--disable-opcache configure オプションは削除され、 ビルドしても opcache.sophp_opcache.dll はもはや生成されません。

zend_extension=opcache.sozend_extension=php_opcache.dll INI 設定を使うと、警告が発生するようになりました。

PCNTL

pcntl_exec()$args パラメータのエントリに、 null バイトが含まれていた場合、 ValueError がスローされるようになりました。

pcntl_exec()$env_vars パラメータのエントリまたはキーに、 null バイトが含まれていた場合、 ValueError がスローされるようになりました。

PCRE

semi-deprecated 扱いになっていた、 コンパイルオプション PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK 抜きでビルドされるようになりました。

PDO

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_LATEPDO::FETCH_CLASS 以外のフェッチモードと一緒に使われた場合、 ValueError がスローされるようになりました。 これは、他のフェッチフラグの動作と一貫性を持たせるためです。

PDO::fetchAll() で、 PDO::FETCH_INTO をフェッチモードとして使おうとすると、 PDO::FETCH_LAZY と同様に ValueError がスローされるようになりました。

PDO_FIREBIRD

Firebird ドライバが生成した PDOStatement に対して、長過ぎるカーソル名を設定しようとすると、 ValueError がスローされるようになりました。

PDO_SQLITE

SQLite の PDO::quote() は、 文字列に null バイトが含まれていた場合に、 エラーモードに応じて警告を発生させたり、例外をスローするようになりました。

PDO::sqliteCreateCollation() は、 コールバック関数の戻り値の型が間違っている場合に、 例外をスローするようになりました。 この変更によって、 Pdo\Sqlite::createCollation() の動作とより一致するようになります。

POSIX

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 をスローします。

Reflection

無効なターゲットにアトリビュートが適用された場合、 ReflectionAttribute::newInstance() は、 内部的なアトリビュート向けに例外をスローするようになりました。 #[\DelayedTargetValidation] を使うと、 発生するエラーがコンパイル時から実行時に遅延されます。

Session

パイプ文字 (|) が含まれたキーを持つ $_SESSION にセッションデータを書き込もうとすると、 黙って失敗するのではなく、警告が発生するようになりました。

session_start() は、 オプション引数をより厳格に扱うようになりました。 配列が連想配列でない場合、 ValueError がスローされるようになりました。 read_and_close の値が int と互換性のない値の場合、 TypeError がスローされるようになりました。

SimpleXML

ノードの集合以外を返す XPath 式を SimpleXMLElement::xpath() に渡した場合、警告が発生し、false を返すようになりました。 これより前のバージョンでは、黙って失敗し、 空の配列を返していました。

SNMP

snmpget(), snmpset(), snmp2_get(), snmp2_set(), snmp3_get(), snmp3_set() SNMP::__construct() は、 ValueError をスローするようになりました。 スローされるのは、ホスト名が長すぎたり、 ホスト名が null バイトを含んでいたり、 負の値や 65535 を超えるポート番号を指定したり、 タイムアウトやリトライの値が -1 より小さかったり、大きすぎたりする場合です。

SOAP

SoapClient::__doRequest() に、 オプションの $uriParserClass パラメータが新しく追加されました。 これは、文字列と null を受け入れます。 null を渡すと、オリジナルの parse_url() ベースのメソッドになります。 Uri\Rfc3986\UriUri\WhatWg\Url を渡すと、 新しいバックエンドを使います。

Sockets

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 がスローされるようになりました。

SPL

ArrayObject は 列挙型を受け入れなくなりました。 列挙型の $name$value プロパティが、PHP エンジンの想定を壊す可能性があるからです。

SplFileObject::fwrite()$length パラメータは、nullable になりました。 デフォルト値が 0 から null に変更されています。

Standard

printf ファミリの関数に精度を指定しないフォーマットを使った場合、 精度を 0 として扱うようになりました。 これより前のバージョンでは、誤って精度をリセットしていました。

Tidy

tidy::__construct(), tidy::parseFile(), tidy::parseString() は、 無効な設定値が含まれていたり、 読み取り専用の内部エントリを設定しようとした場合に ValueError をスローするようになりました。 設定キーが文字列でない場合は、 TypeError がスローされるようになっています。

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top