## 下位互換性のない変更点

### 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() で分解した場合、 警告が発生するようになりました。

#### キャスト関連の警告

浮動小数点数(または浮動小数点数のように見える文字列) を int 型にキャストする際、 それらが int 型として表現できない場合に警告が発生するようになりました。 これは明示的な int キャストと暗黙的な int キャストの両方に影響します。

NAN を他の型にキャストした場合、警告が発生するようになりました。

### 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.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

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]`

PDOStatement::fetch(), PDOStatement::fetchObject(), PDOStatement::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 がスローされるようになりました。 これは、他のフェッチフラグの動作と一貫性を持たせるためです。

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

setlocale() の `locales` 引数に整数 `0` を渡すことはサポートされなくなり、 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\Uri や Uri\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 がスローされるようになっています。

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