readline 拡張モジュール が組み込まれていないのに、 -a オプションを使った場合、 エラーが発生するようになりました。 以前のバージョンでは、 readline が組み込まれていない時に -a オプションを使うと、 php コマンドを引数なしでコールしたのと同じ振る舞いをするのに、 "Interactive mode enabled"
というメッセージを追加で出力していました。 この場合のモードは、インタラクティブでは ありませんでした。
phpdbg のリモート関連の機能が削除されました。
foreach、 var_dump()、 serialize()、 オブジェクトの比較時などで用いられるプロパティの順序が変更されました。 プロパティは宣言や継承に応じて、自然順に並ぶようになりました。 親クラスで宣言されたプロパティは、 子クラスのプロパティの前に並びます。
この順序は、 構造体 zend_object
内部のレイアウトと一致しており、 default_properties_table[]
と properties_info_table[]
でも同様の順序が用いられています。 以前のバージョンでは、 プロパティの順序がドキュメント化されておらず、 クラスの継承の実装の詳細に依存していました。
FILTER_VALIDATE_INT
フィルタの FILTER_FLAG_ALLOW_OCTAL
フラグは、 8進数のプレフィックス ("0o"
/"0O"
) が先頭についた8進文字列を受け入れるようになりました。
全ての GMP 関数が、 8進数のプレフィックス ("0o"
/"0O"
) が先頭についた8進文字列を受け入れるようになりました。
PDO::getAttribute() に PDO::ATTR_SERVER_INFO
や PDO::ATTR_SERVER_VERSION
を指定した場合でも、 値を返すようになりました。 以前のバージョンでは、 PDOException をスローしていました。
ReflectionProperty::setAccessible() と ReflectionMethod::setAccessible() は、もはや意味をなさなくなりました。 プロパティとメソッドは、 常にリフレクション経由でアクセス可能と見なされるようになっています。
syslog() 関数は、バイナリセーフになりました。
imagewebp() 関数の quality 引数に IMG_WEBP_LOSSLESS
を指定することで、 ロスレスエンコードが行えるようになりました。
システムが使っている libgd が WebP のロスレスエンコーディングをサポートしている場合にのみ、 この定数は定義されます。
libmysqlclient とリンクした場合に、 mysqli_stmt::next_result() と mysqli::fetch_all() が使えるようになりました。
OpenSSL 拡張モジュール は、OpenSSL 1.0.2 以降が必須になりました。
OpenSSL 3.0 がサポートされるようになりました。 多くの暗号が(レガシーなプロバイダの一部となっているため) デフォルトで有効ではなくなり、 引数の検証 (たとえば鍵の最小サイズ) が厳しくなっています。
SHA256 が、シグネチャのデフォルトとして使われるようになりました。
OpenSSL_SHA256 と OpenSSL_SHA512 シグネチャのサポートが追加されました。
セキュリティプロトコルのために、 SHA256 と SHA512 のサポートが追加されました。
configure オプション --with-password-argon2
は、 libargon2 を検知するのに pkg-config を使うようになっています。 そのため、libargon2 のインストール先を指定するには、 PKG_CONFIG_PATH を使うべきです。
INI ディレクティブ log_errors_max_len は削除されました。 PHP 8.0.0 以降、この設定は意味をなさなくなっていました。
クォートされた文字列の先頭にドル記号がある場合、 そのドル記号はエスケープされるようになりました。 つまり、 "\${"
は、 ${
という文字列として解釈されます。
ダブルクォートで囲まれた文字列中のバックスラッシュは、 エスケープ文字としてより一貫した形で扱われるようになりました。 以前のバージョンでは、 "foo\\"
の後に改行文字以外の文字が続いた場合、 文字列の終端とは見なされませんでした。 PHP 8.1.0 以降では、foo\
という文字列として解釈されるようになります。 例外として、"foo\"
の後に改行文字が続いた場合は、 foo\
という文字列として解釈されます。 文字列が終端していないとは見なされません。 但し、"C:\foo\"
のような、 Windows のファイルパスを使う場合には例外が存在します。