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

このセクションで明示的に述べられていなくても、 新しい関数、 クラス、インターフェイス、列挙型、 または定数は、 再宣言によるErrorがスローされる可能性があります。

### PHP コア

#### exit() の動作の変更

exit() (およびdie()) 言語構造は、関数のように振る舞います。 これにより、callableとして渡すことができ、 `strict_types` 宣言の影響を受け、 任意の非整数値を文字列にキャストする代わりに、通常の型強制を行います。

そのため、exit() および die() に 無効な型を渡すと、一貫してTypeError が スローされるようになりました。

#### 比較中の再帰

比較中に再帰が発生すると、 `E_ERROR` の致命的なエラーの代わりに、 Error 例外がスローされるようになりました。

#### readonly プロパティの間接的な変更

`__clone()` 内で readonly プロパティを間接的に変更することは、 もはや許可されなくなりました。例えば、`$ref = &$this->readonly` のようなコードです。 これは readonly の初期化時にはすでに禁止されており、 「クローン時の readonly の再初期化」の実装における見落としでした。

#### 定数の型の変更

`PHP_DEBUG` および `PHP_ZTS` 定数の型が、 int から bool に変更されました。

#### 一時ファイル名の長さ

アップロードされたファイルや tempnam() 関数で作成されるファイルの名前は、 以前より13バイト長くなりました。 総合的な長さは引き続きプラットフォーム依存です。

#### `E_STRICT` エラーレベルの削除

`E_STRICT` エラーレベルは、 PHPエンジン内で使用されなくなったため削除されました。 `E_STRICT` 定数は非推奨となりました。

### 型が追加された拡張クラスの定数

以下の拡張クラスは、定数に型が宣言されました:

- Date
- Intl
- PDO
- Reflection
- SPL
- Sqlite
- XMLReader

### リソースからオブジェクトへの移行

いくつかの resource が object に移行されました。 is_resource() を使用した戻り値のチェックは、 特に指定がない限り、`false` かどうかを確認するように置き換える必要があります。

#### DBA

DBA 関数は、 `dba_connection` resource の代わりに Dba\Connection オブジェクトを受け取り、返すようになりました。

#### ODBC

ODBC 関数は、 `odbc_result` resource の代わりに Odbc\Result オブジェクトを受け取り、返すようになりました。

ODBC 関数は、 `odbc_connection` resource の代わりに Odbc\Connection オブジェクトを受け取り、返すようになりました。

#### SOAP

SoapClient::$httpurl プロパティは、 `soap_url` resource の代わりに Soap\Url オブジェクトになりました。 is_resource() を使用したチェック (例: `is_resource($client->httpurl)`)は、 `null` かどうかのチェック(例: `$client->httpurl !== null`)に置き換える必要があります。

SoapClient::$sdl プロパティは、 `soap_sdl` resource の代わりに Soap\Sdl オブジェクトになりました。 is_resource() を使用したチェック (例: `is_resource($client->sdl)`)は、 `null` かどうかのチェック(例: `$client->sdl !== null`)に置き換える必要があります。

### 新しい警告と例外

プログラミングエラー、つまり無効な値が引数として提供された場合にトリガーされる 新しい警告と例外が追加されました。

#### cURL

curl_multi_select() は、 `timeout` パラメータが `0` 未満または `PHP_INT_MAX` を超える場合、 ValueError をスローするようになりました。

#### GD

imagejpeg(), imagewebp(), imagepng(), imageavif() は、無効な `quality` が渡された場合、 ValueError をスローするようになりました。

imageavif() は、 無効な `speed` パラメータ値が渡された場合、 ValueError をスローするようになりました。

imagescale() は、 `width` または `height` パラメータが アンダーフロー/オーバーフローした場合、 ValueError をスローするようになりました。

imagescale() は、 無効な `mode` パラメータ値が渡された場合、 ValueError をスローするようになりました。

imagefilter() は、 `IMG_FILTER_SCATTER` フィルタで、 `sub` または `plus` パラメータが アンダーフロー/オーバーフローした場合、 ValueError をスローするようになりました。

#### Gettext

bind_textdomain_codeset(), textdomain(), d*gettext は、`domain` が空文字列の場合、 ValueError をスローするようになりました。

#### Intl

resourcebundle_get()、 ResourceBundle::get()、および ResourceBundle オブジェクトでのオフセットアクセスは、 以下の場合に例外をスローするようになりました:

- 無効なオフセット型の場合、TypeError
- 空の string の場合、ValueError
- 整数インデックスが符号付き32ビット整数に収まらない場合、 ValueError

IntlDateFormatter::__construct() は、 `locale` が無効な場合、 ValueError をスローするようになりました。

NumberFormatter::__construct() は、 `locale` が無効な場合、 ValueError をスローするようになりました。

#### MBString

mb_encode_numericentity() および mb_decode_numericentity() は、 `map` が int のみで構成されているかをチェックし、 そうでない場合 ValueError をスローするようになりました。

mb_http_input() は、 `type` が無効な場合、常に ValueError をスローするようになりました。

mb_http_output() は、 `encoding` にヌルバイトが含まれていないかをチェックし、 含まれている場合 ValueError をスローするようになりました。

#### ODBC

odbc_fetch_row() は、 `row` が `0` 以下の場合、 `false` を返すようになりました。この場合、警告が発せられます。

#### PCNTL

pcntl_sigprocmask()、 pcntl_sigwaitinfo()、および pcntl_sigtimedwait() 関数は、次の場合エラーをスローするようになりました:

- `signals` 配列が空の場合、 ValueError (pcntl_sigprocmask() で `mode` が `SIG_SETMASK` のときを除く)
- `signals` 配列の値が int でない場合、 TypeError
- `signals` 配列の値が有効なシグナル番号でない場合、 ValueError

pcntl_sigprocmask() 関数は、 `mode` が `SIG_BLOCK`、 `SIG_UNBLOCK`、`SIG_SETMASK` のいずれでもない場合、 ValueError をスローするようになりました。

pcntl_sigtimedwait() 関数は、次の場合エラーをスローするようになりました:

- `seconds` が `0` 未満の場合、 ValueError
- `nanoseconds` が `0` 未満 または `1e9` を超える場合、 ValueError
- `seconds` および `nanoseconds` が両方とも `0` の場合、ValueError

#### Session

session.gc_divisor に正でない値を設定したり、 session.gc_probability に負の値を設定したりすると、警告が発生するようになりました。

#### SimpleXML

simplexml_import_dom() に非XMLオブジェクトを渡すと、 ValueError の代わりに TypeError をスローするようになりました。

#### Standard

round() 関数は、 `mode` の値を検証し、 無効なモードの場合、ValueError をスローするようになりました。 以前は、無効なモードは `PHP_ROUND_HALF_UP` と解釈されていました。

str_getcsv() は、 `separator` および `enclosure` 引数が 1バイトの長さでない場合、または `escape` 引数が 1バイトの長さでないか空文字列でない場合、 ValueError をスローするようになりました。 これは、fputcsv() および fgetcsv() の動作と 同じになるように合わせたものです。

php_uname() 関数は、 `mode` が無効な場合、 ValueError をスローするようになりました。

unserialize() の `"allowed_classes"` オプションは、 クラス名の array でない場合、 TypeError および ValueError をスローするようになりました。

#### XMLReader

無効な文字エンコーディングを XMLReader::open() または XMLReader::XML() に渡すと、 ValueError をスローするようになりました。

ヌルバイトを含む string を渡すと、以前は警告が発せられていましたが、 現在は ValueError をスローするようになりました。

#### XMLWriter

ヌルバイトを含む string を渡すと、以前は警告が発せられていましたが、 現在は ValueError をスローするようになりました。

#### XSL

XSLTProcessor::setParameter() は、 引数にヌルバイトが含まれる場合、ValueError をスローするようになりました。 これは、そもそも正しく動作していませんでした。

XSLTProcessor::importStyleSheet() に 非XMLオブジェクトを渡すと、ValueError の代わりに TypeError がスローされるようになりました。

評価中にPHP関数コールバックの呼び出しに失敗した場合、 警告の発生ではなく、例外がスローされるようになりました。

### Date

相対的な書式 の `number` シンボルは、 再び複数の符号を受け入れるようになりました。 たとえば `+-2` のような形式です。

### DOM

一部のDOMメソッドは、新しいノードを割り当てられない場合、以前は `false` を返すか、`DOM_PHP_ERR` コードの DOMException をスローしていました。 これらは現在、一貫して `DOM_INVALID_STATE_ERR` コードの DOMException をスローするようになりました。 この状況は極めてまれであり、影響を受ける可能性は低いです。 その結果、DOMImplementation::createDocument() は、 戻り値の型が、以前の `DOMDocument|false` から DOMDocument になりました。

以前は、DOMXPath オブジェクトをクローンできましたが、 返されるオブジェクトは使用できませんでした。 これはもはや可能ではなく、DOMXPath オブジェクトをクローンすると、 Error がスローされるようになりました。

DOMImplementation::getFeature() メソッドは削除されました。

### GMP

GMP クラスは final になり、継承できなくなりました。

### MBString

無効な文字列(エンコーディングエラーを含む)に対して、 mb_substr() は他の多くの mbstring 関数と同様に、 文字インデックスを解釈するようになりました。 これにより、mb_strpos() が返す文字インデックスを mb_substr() に渡すことができます。

SJIS-Mac(MacJapanese) 文字列の場合、mb_substr() に渡される文字インデックスは、文字列が Unicode に変換されたときに生成される Unicode コードポイントのインデックスを参照します。 これは、 SJIS-Mac の約40文字が複数の Unicode コードポイントの シーケンスに変換されることによる重要な処理です。

### MySQLi

未使用でドキュメント化されていない定数 `MYSQLI_SET_CHARSET_DIR` は削除されました。

`MYSQLI_STMT_ATTR_PREFETCH_ROWS` 定数は削除されました。 この機能は mysqlnd では利用できません。

`MYSQLI_CURSOR_TYPE_FOR_UPDATE` および `MYSQLI_CURSOR_TYPE_SCROLLABLE` 定数は 削除されました。この機能は mysqlnd および libmysql のどちらでも 実装されていませんでした。

未使用の `MYSQLI_TYPE_INTERVAL` 定数は、 現在は `MYSQLI_TYPE_ENUM` のエイリアスであり、削除されました。

### MySQLnd

MySQL サーバーの待機タイムアウトに対して報告されるエラーコードは、 MySQL サーバーバージョン 8.0.24 以降で `2006` から `4031` に変更されました。

### Opcache

64ビットアーキテクチャ上での opcache.interned_strings_buffer 設定の最大値は `32767` になりました。 以前は `4095` でした。

#### JIT

JIT のデフォルトの設定値は、 `opcache.jit=tracing` および `opcache.jit_buffer_size=0` から、 `opcache.jit=disable` および `opcache.jit_buffer_size=64M` にそれぞれ変更されました。

これはデフォルトの動作には影響しません。 JIT は引き続きデフォルトで無効になっています。 ただし、 opcache.jit_buffer_size ではなく、 opcache.jit を通じて無効化されています。 これは、以前に opcache.jit_buffer_size のみを使用して JIT を有効にし、 opcache.jit を使用してJIT モードを指定していなかったユーザーに影響を与える可能性があります。 JIT コンパイルを有効にするには、 opcache.jit の設定値を適切に設定してください。

JIT コンパイルが有効になっている場合、 JIT コンパイラの初期化に何らかの理由で失敗すると、 PHP は起動時に致命的なエラーで終了するようになりました。

### PCNTL

pcntl_sigprocmask()、 pcntl_sigwaitinfo()、 および pcntl_sigtimedwait() 関数は、 失敗時に常に `false` を返すようになりました。 以前は場合によっては `-1` を返すことがありました。

### PCRE

バンドルされた pcre2lib はバージョン 10.44 に更新されました。 その結果、`{,3}` はテキストとしてではなく 量指定子として認識されるようになりました。 さらに、UCP モードでの一部の文字クラスの意味が変更されました。 完全な変更ログは » PCRE2 Changelog を 参照してください。

### PDO_DBLIB

`Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER` および `Pdo\Dblib::ATTR_DATETIME_CONVERT` 属性は、 整数属性の代わりにブール属性として動作するようになりました。 したがって、PDO::setAttribute() を介して属性を設定し、 PDO::getAttribute() を介して取得する場合、 bool を期待または返却します。

### PDO_FIREBIRD

`PDO::ATTR_AUTOCOMMIT` 属性は、 整数属性の代わりにブール属性として動作するようになりました。 したがって、PDO::setAttribute() を介して属性を設定し、 PDO::getAttribute() を介して取得する場合、 bool を期待または返却します。

この拡張モジュールはいくつかの Firebird C++ API を公開するようになったため、 この拡張モジュールをビルドするには C++ コンパイラが必要になりました。 さらに、この拡張モジュールは fbclient 3.0 以上にでコンパイルする必要があります。

### PDO_MYSQL

`PDO::ATTR_AUTOCOMMIT`、 `PDO::ATTR_EMULATE_PREPARES`、 `PDO::MYSQL_ATTR_DIRECT_QUERY` 属性は、 整数属性の代わりにブール属性として動作するようになりました。 したがって、PDO::setAttribute() を介して属性を設定し、 PDO::getAttribute() を介して取得する場合、 bool を期待または返却します。

### PDO_PGSQL

DSN に認証情報が設定されている場合、PDO コンストラクタの引数よりも優先されるようになり、 ドキュメントの記述に近くなりました。

### SimpleXML

SimpleXMLElement は XML 要素の 表現であるだけでなく、RecursiveIterator でもあります。 PHP 8.4.0 より前では、一部のメソッド(例: SimpleXMLElement::asXML() や SimpleXMLElement::getName())および それらのインスタンスの string へのキャストすると、 暗黙的にイテレータをリセットしていました。

これはイテレータが巻き戻されるため、予期しない無限ループを引き起こす可能性がありました。 例えば:

    <?php

    $xmlString = "<root><a><b>1</b><b>2</b><b>3</b></a></root>";
    $xml = simplexml_load_string($xmlString);

    $nodes = $xml->a->b;
    foreach ($nodes as $nodeData) {
        echo "nodeData: " . $nodeData . "\n";

        $xml = $nodes->asXml();
    }

これは無限ループを引き起こしていました。

    nodeData: 1
    nodeData: 2
    nodeData: 2
    nodeData: 2
    nodeData: 2
    nodeData: 2
    nodeData: 2
    // ...

しかし、この動作は修正され、 SimpleXMLElement は明示的に巻き戻されない限り、 イテレータをリセットしなくなりました。 つまり、前述の例は現在では次のようになります:

    nodeData: 1
    nodeData: 2
    nodeData: 3

### SOAP

SoapClient::$typemap は、resource ではなく array になりました。 is_resource() を使用したチェック （例: `is_resource($client->typemap)`)は、 `null` かどうかのチェック（例: `$client->typemap !== null`）に置き換える必要があります。

SOAP 拡張モジュールには、session 拡張モジュールへの オプションの依存関係が追加されました。 PHP が session 拡張モジュールなしでビルドされ、かつ --enable-rtld-now 構成フラグが有効になっている場合、 SOAP 拡張モジュールも使用していると、 起動時にエラーが発生します。 これを解決するには、rtld-now を使用しないか、session 拡張モジュールを読み込んでください。

### Standard

strcspn() で `characters` に空文字列を指定すると 文字列の長さが返されるようになりました。 以前は、最初のヌルバイトで誤って停止していました。

http_build_query() は、Backed Enumを正しく処理するようになりました。

stream_bucket_make_writeable() および stream_bucket_new() は、 stdClass のインスタンスではなく、 StreamBucket のインスタンスを返すようになりました。

### Tidy

コンストラクタでの失敗時に、警告を発して壊れたオブジェクトになるのではなく、 例外をスローするようになりました。

### XML

xml_set_*_handler 関数は、`handler` パラメータに対して callable|string|null の 有効なシグネチャを宣言し、チェックするようになりました。 さらに、xml_set_object() で設定されたオブジェクトのメソッド名に対応する string 型の値は、事前に渡されたオブジェクトのクラス上にメソッドが存在するかどうかが チェックされるようになりました。 従って、xml_set_object() は、 callable メソッドを設定する前に呼び出す必要があります。 ハンドラを無効にするために空文字列を渡すことは引き続き許可されていますが、 非推奨となりました。

しかし、xml_set_object() と callable でない文字列を渡すことは非推奨です。 そのようなインスタンスをメソッドを直接参照する callable に 変更することをお勧めします。

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