新機能

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) と同じです。

  • newinstanceof が、 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::createFromInterfaceDateTimeImmutable::createFromInterface が追加されました。

  • DateTime のフォーマット指定子 p が追加されました。 これは P と同じですが、 UTC の +00:00 ではなく、 Z を返します。

DOM

新しいDOMの走査と管理を行う API を持つ DOMParentNodeDOMChildNode が追加されました。

フィルタ

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 を補完するものです。

リフレクション

  • 以下のメソッドは、内部関数の引数のデフォルト値に関する情報を返すようになりました:

    • ReflectionParameter::isDefaultValueAvailable
    • ReflectionParameter::getDefaultValue
    • ReflectionParameter::isDefaultValueConstant
    • ReflectionParameter::getDefaultValueConstantName

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);
    ?>

  • 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::statusZipArchive::statusSys プロパティ、 または ZipArchive::getStatusString メソッドを使って、 アーカイブがクローズされた後でもエラーをチェックできるようになりました。

  • ZipArchive::addGlobZipArchive::addPattern メソッドの 'remove_path' オプションは、 ('add_path' オプションと一貫性を保つため) 任意の文字列のプレフィックスとして扱われるようになりました。 これより前のバージョンでは、デイレクトリ名として扱われていました。

  • オプションの 圧縮/伸長 機能が phpinfo でも一覧できるようになりました。