新機能
PHP コア
その他の新機能
WeakMap
クラスが追加されました。ValueError クラスが追加されました。
任意の数の関数の引数が、可変長引数に置き換えられるようになりました。 但し、型に互換性がある場合に限ります。 たとえば、次のようなコードが書けるようになります:
<?phpclass A { public function method(int $many, string $parameters, $here) {}}class B extends A { public function method(...$everything) {}}?>
以下のようにして、static ("遅延静的束縛"における) 型が、 戻り値の型として使えるようになりました:
<?phpclass 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');
引数のリストに付ける最後のカンマも、オプションで許可されるようになりました。
<?phpfunction functionWithLongSignature( Type1 $parameter1, Type2 $parameter2, // <-- このカンマが許可されるようになりました) {}
変数に保存せずに、 例外をキャッチするために、
catch (Exception)
というコードが書けるようになりました。mixed 型のサポートが追加されました。
親クラスで宣言された private メソッドは、 子クラスのメソッドに対して継承ルールを強制しなくなりました( private final と宣言されたコンストラクタは例外です)。 次の例は、どういった制限がなくなるのかを示しています:
<?phpclass 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で、同じ機能を提供するものです。
日付と時刻
- 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ファイル)から、
ステータスを取得することが出来るようになります。
実行時間がかかっているリクエストを処理しているために、全ての子プロセスがビジーである場合、
ステータスを取得するのに役立ちます。
国際化関数
定数 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() を補完するものです。
リフレクション
- 以下のメソッドは、内部関数の引数のデフォルト値に関する情報を返すようになりました:
標準ライブラリ
文字列に
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 のデフォルトの浮動小数点のフォーマットを再現することができます:<?phpprintf("%.*H", (int) ini_get("precision"), $float);printf("%.*H", (int) ini_get("serialize_precision"), $float);?>
proc_open() に、疑似端末(PTY) ディスクリプタのサポートが追加されました。 以下のコードは、
stdin
,stdout
,stderr
を同じPTYにアタッチします:<?php$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);?>
proc_open() 関数は、 ソケットペアのディスクリプタをサポートするようになりました。 以下のコードは、異なるソケットペアを
stdin
,stdout
,stderr
にアタッチします:<?php$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);?>
Windows では、パイプと異なり、ソケットは ブロッキングI/O の問題の影響を受けません。 しかし、全てのプログラムが標準入出力のソケットで正しく動くとは限りません。
ソート関数が安定ソートになりました。 これは、比較して等しいと判定された要素は、もともとの順序を維持するということです。
array_diff(), array_intersect() や、 そのバリエーションの関数は、単一の配列を引数に取れるようになりました。 これによって、以下のような使い方が出来るようになるということです:
<?php// $excludes が空でも問題ありません:array_diff($array, ...$excludes);// $arrays が 単一の配列だけを含んでいても問題ありません:array_intersect(...$arrays);?>
ob_implicit_flush() 関数の
flag
引数が、int ではなく bool を受け取るように変更されました。
Tokenizer
PhpToken クラスは、 オブジェクトベースのインターフェイスを tokenizer に追加します。 このクラスは、統一された、人間工学に基づいた表現を提供しながら、 メモリ効率がよく、高速になっています。
Zip
- Zip 拡張機能が、1.19.1 に更新されました。
- エントリの変更時間を設定するための ZipArchive::setMtimeName(), ZipArchive::setMtimeIndex() が追加されました。
- アーカイブがクローズされている間に行われた更新情報を提供する ZipArchive::registerProgressCallback() が追加されました。
- アーカイブがクローズされている間にキャンセルを許可する ZipArchive::registerCancelCallback() が追加されました。
- エントリの内容を置換する ZipArchive::replaceFile() が追加されました。
- オプションの圧縮機能がサポートされているかをチェックする ZipArchive::isCompressionMethodSupported() が追加されました。
- オプションの暗号化機能がサポートされているかをチェックする ZipArchive::isEncryptionMethodSupported() が追加されました。
- 最後に追加されたエントリのインデックスの値を取得するために、
ZipArchive::lastId
が追加されました。 ZipArchive::status
やZipArchive::statusSys
プロパティ、 または ZipArchive::getStatusString() メソッドを使って、 アーカイブがクローズされた後でもエラーをチェックsできるようになりました。- ZipArchive::addGlob() と ZipArchive::addPattern() メソッドの
'remove_path'
オプションは、 ('add_path'
オプションと一貫性を保つため) 任意の文字列のプレフィックスとして扱われるようになりました。 これより前のバージョンでは、デイレクトリ名として扱われていました。 - オプションの 圧縮/伸長 機能が phpinfo でも一覧できるようになりました。