下位互換性のない変更点
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 によって制限されている場合でも、
警告が発生するようになっています。