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

### Date

DateTime::createFromImmutable() の仮の戻り値の型が、 static になりました。 これより前のバージョンでは、DateTime でした。

DateTimeImmutable::createFromMutable() の仮の戻り値の型が、 static になりました。 これより前のバージョンでは、DateTimeImmutable でした。

相対的な書式 の `number` シンボルは、複数の符号を受け入れなくなりました。 たとえば、`+-2` のようなフォーマットです。

### ODBC

ODBC 拡張モジュールは、ユーザー名/パスワードと接続文字列が両方渡された場合に、 ユーザー名とパスワードをエスケープするようになりました。そして、 エスケープ済みのものを接続文字列と結合することが必須になりました。 これより前のバージョンでは、 エスケープする必要がある値が含まれたユーザー指定の文字列によって、悪意ある接続文字列を生成される可能性がありました。 また、ユーザー指定の文字列を値に注入されてしまう可能性もありました。 このエスケープのルールは .NET BCL の DbConnectionOptions の振る舞いと同じです。

### PDO_ODBC

PDO_ODBC 拡張モジュールは、接続文字列を渡した場合にユーザー名とパスワードをエスケープするようになりました。 詳細は ODBC の変更点 を参照ください。

### 標準ライブラリ

glob() は、 すべてのパスが open_basedir によって制限されている場合に、 空の配列を返すようになりました。 これより前のバージョンでは、`false` を返していました。 さらに、パスの一部が open_basedir によって制限されている場合でも、 警告が発生するようになっています。

FilesystemIterator::__construct() を使うと、 以前のバージョンでは `FilesystemIterator::SKIP_DOTS` が常に設定され、削除できませんでしたが、この振る舞いはなくなりました。 以前の振る舞いを維持するには、 `flags` パラメータを使ってその定数を明示的に常に設定しなければいけません。 `flags` パラメータのデフォルト値は変更されていません。

strtolower(), strtoupper(), stristr(), stripos(), strripos(), lcfirst(), ucfirst(), ucwords(), str_ireplace() は、ロケールに依存しなくなりました。 これらは、ロケールが "C" であったかのように ASCII のケース変換を行います。 これらの関数のロケール対応版は、マルチバイト文字列 関数で使えます。 さらに、array_change_key_case() 関数を使った場合や、 `SORT_FLAG_CASE` を使ってソートを行った場合も、ASCII のケース変換を行います。

str_split() は、空文字列を渡した場合に、空の配列を返すようになりました。 これより前のバージョンでは、空文字列の要素が一つ入った配列を返していました。 mb_str_split() は、既に空の配列を返しているため、影響を受けません。

ksort() と krsort() は、 `SORT_REGULAR` を使って数値形式の文字列の比較を行う際に、 PHP 8 で標準になっているルールを使うようになりました。

var_export() は、クラス名をエクスポートする際、 先頭のバックスラッシュを省略しなくなりました。 つまり、エクスポートされるクラス名は完全修飾名になりました。

### Standard PHP Library (SPL)

以下のメソッドは、シグネチャを強制するようになりました:

- SplFileInfo::_bad_state_ex()
- SplFileObject::getCsvControl()
- SplFileObject::fflush()
- SplFileObject::ftell()
- SplFileObject::fgetc()
- SplFileObject::fpassthru()

SplFileObject::hasChildren() の仮の戻り値の型が、 false になりました。 これより前のバージョンでは、bool でした。

SplFileObject::getChildren() の仮の戻り値の型が、 null になりました。 これより前のバージョンでは、?RecursiveIterator でした。

GlobIterator は、 すべてのパスが open_basedir によって制限されている場合に、 空の配列を返すようになりました。 これより前のバージョンでは、`false` を返していました。 さらに、パスの一部が open_basedir によって制限されている場合でも、 警告が発生するようになっています。

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