新機能

PHP コア

プロパティフック

オブジェクトのプロパティは、 get および set 操作に 追加のロジックを関連付けることができるようになりました。 使用方法に応じてそのプロパティは、値を持つ場合もありますし、 仮想的、つまり値を持たない場合もあります。

<?php
class Person
{
    // 「仮想」プロパティ。明示的に設定されることはありません。
    public string $fullName {
        get => $this->firstName . ' ' . $this->lastName;
    }

    // すべての書き込み操作はこのフックを通り、返却値が書き込まれます。
    // 読み取りアクセスは通常通り行われます。
    public string $firstName {
        set => ucfirst(strtolower($value));
    }

    // すべての書き込み操作はこのフックを通り、フックの中で値が書き込まれます。
    // 読み取りアクセスは通常通り行われます。
    public string $lastName {
        set {
            if (strlen($value) < 2) {
                throw new \InvalidArgumentException('Too short');
            }
            $this->lastName = $value;
        }
    }
}

$p = new Person();

$p->firstName = 'peter';
print $p->firstName; // Prints "Peter"
$p->lastName = 'Peterson';
print $p->fullName; // Prints "Peter Peterson"

非対称可視性プロパティ

オブジェクトのプロパティは、set の可視性を get の可視性とは別に制御できるようになりました。

<?php
class Example
{
    // 最初の可視性修飾子は取得時の可視性を制御し、2つ目の修飾子は設定時の可視性を制御します。
    // 取得時の可視性は設定時の可視性よりも狭くなってはいけません。
    public protected(set) string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
}

レイジーオブジェクト

アクセスされるまで初期化が延期されるオブジェクトを作成できるようになりました。 ライブラリやフレームワークは、これらのレイジーオブジェクトを利用して、 初期化に必要なデータや依存関係の取得を遅延させることができます。

<?php
class Example
{
    public function __construct(private int $data)
    {
    }

    // ...
}

$initializer = static function (Example $ghost): void {
    // Fetch data or dependencies
    $data = ...;
    // Initialize
    $ghost->__construct($data);
};

$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);

#[\Deprecated] アトリビュート

新しい Deprecated 属性を使用して、関数、メソッド、 およびクラス定数を非推奨としてマークできます。このアトリビュートで非推奨となった機能の動作は、 PHP 自身が提供する既存の非推奨メカニズムの動作と一致します。 唯一の例外は、発生するエラーコードが E_DEPRECATED ではなく E_USER_DEPRECATED であることです。

PHP 自身が提供する機能の既存の非推奨は、この属性を使用するように更新され、 短い説明を含むことでエラーメッセージが改善されました。

POST 以外の HTTP リクエストでの RFC1867 (マルチパート)リクエストの解析

POST 以外の HTTP リクエストで RFC1867(マルチパート)リクエストを解析するための request_parse_body 関数が追加されました。

括弧なしでの new 式のチェーン

コンストラクタ引数を持つ new 式は直接参照できるようになり、 式を括弧で囲むことなくメソッド呼び出しや プロパティアクセスなどのチェーンが可能になりました。

WeakReference のデバッグ情報の改善

WeakReference のデバッグ情報を取得すると、 参照しているオブジェクト、または参照が無効になっている場合は null が出力されるようになりました。

Closure のデバッグ情報の改善

Closure::__debugInfo の出力には、 Closure の名前、ファイル名、および行が含まれるようになりました。

異なる名前空間ブロックで同一のシンボルを定義

名前空間を終了すると、そこで定義されたシンボルがクリアされるようになりました。 これにより、以前の名前空間ブロックで同じ名前のシンボルが宣言されていても、 名前空間ブロック内でシンボルを使用できるようになりました。

cURL

curl_version は、新たに feature_list 値を返すようになりました。これは、 既知のすべての cURL 機能と、それらがサポートされているか(true)されていないか (false)を示す連想配列です。

CURLOPT_HTTP_VERSION のオプションとして、 CURL_HTTP_VERSION_3 および CURL_HTTP_VERSION_3ONLY 定数 (libcurl 7.66 および 7.88 から利用可能) が追加されました。

cURL オプションとしてCURLOPT_PREREQFUNCTION が追加されました。 接続が確立された後、リクエストが送信される前に呼び出される callable を受け入れます。 この callable は、リクエストを許可または中止するために CURL_PREREQFUNC_OK または CURL_PREREQFUNC_ABORT のいずれかを返す必要があります。

CURLOPT_SERVER_RESPONSE_TIMEOUT が追加されました。 これは以前は CURLOPT_FTP_RESPONSE_TIMEOUT として知られていました。 両方の定数は同じ値を持ちます。

cURL オプションとして CURLOPT_DEBUGFUNCTION が追加されました。 リクエストの実行中に呼び出される callable を受け入れます。 この callable は、CurlHandle オブジェクト、 デバッグメッセージの種類を含む整数、 およびデバッグメッセージを含む文字列を受け取ります。 デバッグメッセージの種類は、次の定数のいずれかです:

  • CURLINFO_TEXT
  • CURLINFO_HEADER_IN
  • CURLINFO_HEADER_OUT
  • CURLINFO_DATA_IN
  • CURLINFO_DATA_OUT
  • CURLINFO_SSL_DATA_IN
  • CURLINFO_SSL_DATA_OUT
このオプションを設定した場合、CURLINFO_HEADER_OUT を設定してはいけません。 同じ libcurl の機能を使用するためです。

curl_getinfo は、新たに posttransfer_time_us キーを返すようになりました。 これは、開始から最後のバイトが送信されるまでのマイクロ秒数を示します。 リダイレクトが行われた場合、各リクエストの時間が合計されます。 この値は、curl_getinfooption パラメータに CURLINFO_POSTTRANSFER_TIME_T を渡すことでも取得できます。 libcurl 8.10.0 以降が必要です。

DOM

Dom 名前空間と、既存の DOM クラスに対応する 新たなクラスが追加されました(例: Dom\NodeDOMNode に対応する新しいクラスです)。 これらのクラスは HTML 5 に対応しており、WHATWG の仕様に準拠しています。 これは DOM 拡張の長年のバグを解決します。 従来の DOM クラスも後方互換性のために引き続き利用可能です。

DOMNode::compareDocumentPosition と関連する定数が追加されました:

  • DOMNode::DOCUMENT_POSITION_DISCONNECTED
  • DOMNode::DOCUMENT_POSITION_PRECEDING
  • DOMNode::DOCUMENT_POSITION_FOLLOWING
  • DOMNode::DOCUMENT_POSITION_CONTAINS
  • DOMNode::DOCUMENT_POSITION_CONTAINED_BY
  • DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC

DOMXPath::registerPhpFunctions に任意の callable を渡すことが可能になりました。 さらに、 DOMXPath::registerPhpFunctionNs により、 php:function('name') ではなく、ネイティブな関数呼び出し構文で コールバックを登録できるようになりました。

Intl

NumberFormatter::ROUND_HALFODD が追加されました。 既存の NumberFormatter::ROUND_HALFEVEN 機能を 補完します。

OpenSSL

Curve25519 および Curve448 ベースのキーのサポートが追加されました。 具体的には、x25519、ed25519、x448、ed448 フィールドが openssl_pkey_newopenssl_pkey_get_detailsopenssl_sign、および openssl_verify を、サポートするよう拡張されました。

パスワードのハッシュ方法として PASSWORD_ARGON2 が実装されました。 これは OpenSSL 3.2 および NTS ビルドが必要です。

PCRE

同梱の pcre2lib がバージョン 10.44 に更新されました。 これにより、LoongArch JIT サポートが追加され、 Perl 互換のアイテムで波括弧間のスペースが許可され、 可変長の後読みアサーションがサポートされるようになりました。

pcre2lib バージョン 10.44 では、名前付きキャプチャグループの最大長が 32 から 128 に変更されました。

r (PCRE2_EXTRA_CASELESS_RESTRICT) 修飾子と (?r) モード修飾子のサポートされました。 大文字・小文字を区別しない修飾子 (i) と一緒に有効にすると、 ASCII と非 ASCII 文字の混在が禁止されます。

PDO

ドライバ固有のサブクラスのサポートが追加されました。 PDO のサブクラスを追加することで、 データベース固有の機能のサポートを向上します。 新しいクラスは、 PDO::connect メソッドを呼び出すか、 ドライバ固有のサブクラスを直接インスタンス化することで 利用できます。

ドライバ固有の SQL パーサーのサポートが追加されました。 デフォルトのパーサーは以下をサポートします:

  • シングルクオートやダブルクオートで囲まれたリテラルでのクオートの二重化によるエスケープ
  • 2 つのハイフンとネストされていない C スタイルのコメント

PDO_MYSQL

以下をサポートするカスタムパーサーが追加されました:

  • シングルクオートやダブルクオートで囲まれたリテラルでのクオートの二重化やバックスラッシュによる エスケープ
  • バッククオートで囲まれたリテラルでのクオートの二重化によるエスケープ
  • 1 つの空白が続く 2 つのハイフン、ネストされていない C スタイルのコメント、 # によるコメント

PDO_PGSQL

以下をサポートするカスタムパーサーが追加されました:

  • シングルクオートやダブルクオートで囲まれたリテラルでのクオートの二重化によるエスケープ
  • C スタイルの「エスケープ」文字列リテラル (E'string')
  • ドル記号で囲まれた文字列リテラル
  • 2 つのハイフンとネストされていない C スタイルのコメント
  • ? 演算子のエスケープシーケンスとしての ?? のサポート

PDO_SQLITE

以下をサポートするカスタムパーサーが追加されました:

  • シングルクオート、ダブルクオート、バッククオートで囲まれたリテラルでのクオートの二重化による エスケープ
  • 識別子の角括弧によるクオート
  • 2 つのハイフンとネストされていない C スタイルのコメント

Phar

Zip アーカイブの Unix タイムスタンプ拡張のサポートが追加されました。

Readfile

PHP_HISTFILE 環境変数を利用し .php_history パスを変更する機能が追加されました。

Reflection

ReflectionAttribute に デバッグ体験を向上させるための name プロパティが追加されました。

ReflectionClassConstant::__toStringおよび ReflectionProperty::__toString は、 添付されたドキュメントコメントを返すようになりました。

レイジーオブジェクト機能に関連する複数の新しいメソッドと定数が 追加されました:

  • ReflectionClass::newLazyGhost
  • ReflectionClass::newLazyProxy
  • ReflectionClass::resetAsLazyGhost
  • ReflectionClass::resetAsLazyProxy
  • ReflectionClass::isUninitializedLazyObject
  • ReflectionClass::initializeLazyObject
  • ReflectionClass::markLazyObjectAsInitialized
  • ReflectionClass::getLazyInitializer
  • ReflectionProperty::skipLazyInitialization
  • ReflectionProperty::setRawValueWithoutLazyInitialization
  • ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
  • ReflectionClass::SKIP_DESTRUCTOR

SOAP

クラスマップでの名前空間のクラーク式記法のサポートが追加されました。 クラスマップ内でクラーク式記法を使用して、 特定の名前空間の型を特定のクラスに解決するエントリを指定できるようになりました。 例: '{http://example.com}foo' => 'FooClass'

DateTimeInterface のインスタンスが xsd:datetime や類似の要素に渡されると、 空の文字列としてではなく、そのままシリアライズされるようになりました。

持続的セッションが共有セッションモジュールで動作するようになりました。

Standard

RoundingMode 列挙型が追加されました。 PHP_ROUND_* 定数より 明確な名前と発見性を提供します。 さらに、4 つの新しい丸めモードが追加されました。これらは RoundingMode 列挙型を介してのみ利用可能です。

XSL

シングルクオートとダブルクオートの両方を含むパラメータを 使用できるようになりました。

XSLTProcessor::registerPhpFunctions に 任意の callable を渡すことが可能になりました。

XSLTProcessor::$maxTemplateDepth および XSLTProcessor::$maxTemplateVars が追加されました。 XSL テンプレート評価の再帰の深さを制御することができます。

Zip

ZipArchive::ER_TRUNCATED_ZIP 定数が追加されました。これは libzip 1.11 で追加されました。