PHPのお勉強!

PHP TOP

新機能

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() 関数が追加されました。

括弧なしでの 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_HEADER_OUT を設定してはいけません。 同じ libcurl の機能を使用するためです。

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

DOM

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

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

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() は、 添付されたドキュメントコメントを返すようになりました。

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