新機能
PHP コア
名前付き引数
名前付き引数 のサポートが追加されました。
アトリビュート
アトリビュート のサポートが追加されました。
コンストラクタのプロパティ昇格機能
コンストラクタの引数をプロパティへ昇格させる機能 が追加されました。
union 型
union 型 のサポートが追加されました。
match 式
match
式 のサポートが追加されました。
nullsafe 演算子
nullsafe 演算子 (?->
) のサポートが追加されました。
その他の新機能
-
WeakMap クラスが追加されました。
-
ValueError クラスが追加されました。
-
任意の数の関数の引数が、可変長引数に置き換えられるようになりました。 但し、型に互換性がある場合に限ります。 たとえば、次のようなコードが書けるようになります:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?> -
以下のようにして、static ("遅延静的束縛"における) 型が、 戻り値の型として使えるようになりました:
<?php
class Test {
public function create(): static {
return new static();
}
}
?> -
オブジェクトのクラス名を
$object::class
と書くことで取得できるようになりました。 この結果は、get_class($object)
と同じです。 -
new
とinstanceof
が、new (expression)(...$args)
や$obj instanceof (expression)
という形で、任意の式と一緒に使えるようになりました。 -
変数の文法に一貫性を持たせるため、いくつかの修正が適用されます。 たとえば、
Foo::BAR::$baz
のような書き方が許可されるようになりました。 -
インターフェイス Stringable が追加されました。 クラスが __toString() メソッドを定義していた場合、 このインターフェイスが自動的に実装されます。
-
トレイトで、private な抽象メソッドを定義できるようになりました。 このメソッドは、トレイトを使うクラスで実装されなければなりません。
-
throw
が式として使えるようになりました。 これによって、以下のような書き方ができるようになります:<?php
$fn = fn() => throw new Exception('Exception in arrow function');
$user = $session->user ?? throw new Exception('Must have user'); -
引数のリストに付ける最後のカンマも、オプションで許可されるようになりました。
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- このカンマが許可されるようになりました
) {
} -
変数に保存せずに、 例外をキャッチするために、
catch (Exception)
というコードが書けるようになりました。 -
mixed 型のサポートが追加されました。
-
親クラスで宣言された private メソッドは、 子クラスのメソッドに対して継承ルールを強制しなくなりました( private final と宣言されたコンストラクタは例外です)。 次の例は、どういった制限がなくなるのかを示しています:
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// "final" が意味をなさなくなったので、警告が発生します:
private final function method4() {}
}
class ChildClass extends ParentClass {
// 親クラスの private メソッドとアクセス権の修飾子が異なっている
// 以下の全ての宣言が許されるようになりました。
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?> -
(int) $resource
と同じ値を返す get_resource_id() 関数が追加されました。 よりわかりやすいAPIで、同じ機能を提供するものです。 -
InternalIterator が追加されました。
日付と時刻
-
DateTime::createFromInterface() と DateTimeImmutable::createFromInterface() が追加されました。
-
DateTime のフォーマット指定子
p
が追加されました。 これはP
と同じですが、 UTC の+00:00
ではなく、Z
を返します。
DOM
新しいDOMの走査と管理を行う API を持つ DOMParentNode と DOMChildNode が追加されました。
フィルタ
FILTER_VALIDATE_BOOLEAN
のエイリアスとして、
FILTER_VALIDATE_BOOL
が追加されました。
新しい名前のほうが望ましいです。なぜなら、
正規化された型の名前を使っているからです。
Enchant
enchant_dict_add(), enchant_dict_is_added(),
LIBENCHANT_VERSION
が追加されました。
FPM
新しいオプション pm.status_listen
が追加されました。
これによって、異なるエンドポイント(例: ポートやUDSファイル)から、
ステータスを取得することが出来るようになります。
実行時間がかかっているリクエストを処理しているために、全ての子プロセスがビジーである場合、
ステータスを取得するのに役立ちます。
Hash
HashContext オブジェクトが、シリアライズ出来るようになりました。
国際化関数
定数 IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
,
IntlDateFormatter::RELATIVE_SHORT
が追加されました。
LDAP
検索結果に含まれる参照メッセージの数を返す ldap_count_references() が追加されました。
OPcache
opcache.record_warnings INI ディレクティブが有効になっている場合、 OPcache はコンパイル時の警告を記録し、次に include されたときにそれを繰り返します。 これは、たとえキャッシュから情報を得た場合でも同じです。
OpenSSL
暗号化メッセージ構文(CMS)
(» RFC 5652) のサポートが追加されました。
これは、暗号化、復号化、署名、検証と読み込みの関数が含まれます。
API は PKCS #7 の関数と似ていますが、新しいエンコーディングの定数が追加されています:
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
OPENSSL_ENCODING_PEM
です。
- 証明書を使ってファイル中のメッセージを暗号化し、 結果を指定されたファイルに出力する openssl_cms_encrypt() が追加されました。
- ファイル中の S/MIME メッセージを復号化し、 結果を指定されたファイルに出力する openssl_cms_decrypt() が追加されました。
- CMSファイルを PEM 証明書の配列にエクスポートする openssl_cms_read() が追加されました。
- 証明書と鍵を使ってファイル中のMIMEメッセージに署名し、 結果を指定されたファイルに出力する openssl_cms_sign() が追加されました。
- データブロックが無傷なことや、 署名した人がその人であることを検証し、 署名した人の証明書を返す openssl_cms_verify() が追加されました。
正規表現 (Perl互換)
直近で発生した PCRE に関するエラーを人間が読みやすいメッセージとして返す preg_last_error_msg() が追加されました。 これは、整数の enum を返していた preg_last_error() を補完するものです。
リフレクション
-
以下のメソッドは、内部関数の引数のデフォルト値に関する情報を返すようになりました:
SQLite3
データベース上で認証する用途に使う、 ユーザー空間のコールバックを設定する SQLite3::setAuthorizer() と、 それに対応するクラス定数が追加されました。
標準ライブラリ
-
文字列に
haystack
が含まれているかどうかを調べる str_contains() 関数が追加されました。文字列が
needle
で始まるかを調べる str_starts_with() 関数が追加されました。文字列が
needle
で終わるかを調べる str_ends_with() 関数が追加されました。 -
IEEE 754 のセマンティクスに沿って浮動小数点数の割り算を行う fdiv() 関数が追加されました。 ゼロ除算は、well-defined とみなされ、
Inf
,-Inf
,NaN
のいずれかを返します。 -
エラーメッセージで使うのに便利な型を返す get_debug_type() 関数が追加されました。 gettype() と違うのは、 この関数は正規化された型の名前を使い、オブジェクトのときはクラス名を返し、 リソースの場合はリソースのタイプを示すことです。
-
printf() 関数とその仲間の関数は、 フォーマット指定子
%h
と%H
をサポートしました。 これらは%g
および%G
と同じですが、 10進数の区切り文字をLC_NUMERIC
ロケールによって決めるのではなく、 常に"."
を使います。 -
printf() 関数とその仲間の関数は、 精度または広さを指定する用途のために
"*"
をサポートしました。 この場合、精度/広さは printf の引数として渡します。 精度として-1
を%g
,%G
,%h
,%H
に指定することも出来ます。 たとえば、次のコードで、PHP のデフォルトの浮動小数点のフォーマットを再現することができます:<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>