下位互換性のない変更点

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 は、既に空の配列を返しているため、影響を受けません。

ksortkrsort は、 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 になりました。 これより前のバージョンでは、RecursiveIteratornull でした。

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