PHP 8.5.0 Beta 3 available for testing

下位互換性のない変更点

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)

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

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

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

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

add a note

User Contributed Notes 1 note

up
0
al dot turani at gmail dot com
1 day ago
Another backward incompatible change, not mentioned in the docs, is that function `date_default_timezone_get()` no longer returns current time zone.

Prior to 8.2, this function returned:
- Time zone set by `date_default_timezone_set()` (if set).
- Time zone specified in `date.timezone` (if set).
- Current time zone, if none of above applies.

From 8.2 onward, if neither of the first two variants applies, this function returns UTC. This breaks scenarios where current time zone shall be used.

See <https://github.com/php/php-src/issues/11496> for discussion.
To Top