新機能
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
{
// 最初のアクセス権の修飾子は get 時のアクセス権を制御し、2つ目の修飾子は set 時のアクセス件を制御します。
// 取得時のアクセス権は設定時のそれよりも狭くなってはいけません。
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() 関数が追加されました。
WeakReference のデバッグ情報の改善
WeakReference のデバッグ情報を取得すると、
参照しているオブジェクト、または参照が無効になっている場合は
null
が出力されるようになりました。
異なる名前空間ブロックで同一のシンボルを定義
名前空間を終了すると、そこで定義されたシンボルがクリアされるようになりました。 これにより、以前の名前空間ブロックで同じ名前のシンボルが宣言されていても、 名前空間ブロック内でシンボルを使用できるようになりました。
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_getinfo() の
option
パラメータに
CURLINFO_POSTTRANSFER_TIME_T
を渡すことでも取得できます。
libcurl 8.10.0 以降が必要です。
DOM
Dom 名前空間と、既存の DOM クラスに対応する 新たなクラスが追加されました(例: Dom\Node は DOMNode に対応する新しいクラスです)。 これらのクラスは 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_new()、 openssl_pkey_get_details()、 openssl_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
以下をサポートするカスタムパーサーが追加されました:
- シングルクオートやダブルクオートで囲まれたリテラルでのクオートの二重化やバックスラッシュによる エスケープ
- バッククオートで囲まれたリテラルでのクオートの二重化によるエスケープ
-
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() は、 添付されたドキュメントコメントを返すようになりました。
レイジーオブジェクト機能に関連する複数の新しいメソッドと定数が 追加されました: