オブジェクトのプロパティは、
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(マルチパート)リクエストを解析するための request_parse_body() 関数が追加されました。
WeakReference のデバッグ情報を取得すると、
参照しているオブジェクト、または参照が無効になっている場合は
null
が出力されるようになりました。
名前空間を終了すると、そこで定義されたシンボルがクリアされるようになりました。 これにより、以前の名前空間ブロックで同じ名前のシンボルが宣言されていても、 名前空間ブロック内でシンボルを使用できるようになりました。
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\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')
ではなく、ネイティブな関数呼び出し構文で
コールバックを登録できるようになりました。
NumberFormatter::ROUND_HALFODD
が追加されました。
既存の NumberFormatter::ROUND_HALFEVEN
機能を
補完します。
Curve25519 および Curve448 ベースのキーのサポートが追加されました。 具体的には、x25519、ed25519、x448、ed448 フィールドが openssl_pkey_new()、 openssl_pkey_get_details()、 openssl_sign()、および openssl_verify() を、サポートするよう拡張されました。
パスワードのハッシュ方法として PASSWORD_ARGON2 が実装されました。 これは OpenSSL 3.2 および NTS ビルドが必要です。
同梱の pcre2lib がバージョン 10.44 に更新されました。 これにより、LoongArch JIT サポートが追加され、 Perl 互換のアイテムで波括弧間のスペースが許可され、 可変長の後読みアサーションがサポートされるようになりました。
pcre2lib バージョン 10.44 では、名前付きキャプチャグループの最大長が
32
から 128
に変更されました。
r
(PCRE2_EXTRA_CASELESS_RESTRICT)
修飾子と (?r)
モード修飾子のサポートされました。
大文字・小文字を区別しない修飾子 (i
) と一緒に有効にすると、
ASCII と非 ASCII 文字の混在が禁止されます。
ドライバ固有のサブクラスのサポートが追加されました。 PDO のサブクラスを追加することで、 データベース固有の機能のサポートを向上します。 新しいクラスは、PDO::connect() メソッドを呼び出すか、 ドライバ固有のサブクラスを直接インスタンス化することで 利用できます。
ドライバ固有の SQL パーサーのサポートが追加されました。 デフォルトのパーサーは以下をサポートします:
以下をサポートするカスタムパーサーが追加されました:
#
によるコメント
以下をサポートするカスタムパーサーが追加されました:
E'string'
)
?
演算子のエスケープシーケンスとしての ??
のサポート
以下をサポートするカスタムパーサーが追加されました:
Zip アーカイブの Unix タイムスタンプ拡張のサポートが追加されました。
PHP_HISTFILE 環境変数を利用し
.php_history
パスを変更する機能が追加されました。
ReflectionAttribute に デバッグ体験を向上させるための name プロパティが追加されました。
ReflectionClassConstant::__toString()および ReflectionProperty::__toString() は、 添付されたドキュメントコメントを返すようになりました。
レイジーオブジェクト機能に関連する複数の新しいメソッドと定数が 追加されました:
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
ReflectionClass::SKIP_DESTRUCTOR
クラスマップでの名前空間のクラーク式記法のサポートが追加されました。
クラスマップ内でクラーク式記法を使用して、
特定の名前空間の型を特定のクラスに解決するエントリを指定できるようになりました。
例: '{http://example.com}foo' => 'FooClass'
DateTimeInterface のインスタンスが
xsd:datetime
や類似の要素に渡されると、
空の文字列としてではなく、そのままシリアライズされるようになりました。
持続的セッションが共有セッションモジュールで動作するようになりました。
RoundingMode 列挙型が追加されました。
PHP_ROUND_*
定数より
明確な名前と発見性を提供します。
さらに、4 つの新しい丸めモードが追加されました。これらは
RoundingMode 列挙型を介してのみ利用可能です。
シングルクオートとダブルクオートの両方を含むパラメータを 使用できるようになりました。
XSLTProcessor::registerPhpFunctions() に 任意の callable を渡すことが可能になりました。
XSLTProcessor::$maxTemplateDepth および XSLTProcessor::$maxTemplateVars が追加されました。 XSL テンプレート評価の再帰の深さを制御することができます。
ZipArchive::ER_TRUNCATED_ZIP
定数が追加されました。これは libzip 1.11 で追加されました。