PHP 8.4が昨年11月にリリースされてから早くも5カ月が過ぎました。PHPの開発者の間では、次のマイナーバージョンであるPHP 8.5に向けた開発が開始されています。本連載では、PHP 8.5で強化される機能について紹介していきます。
PHP 8.5の開発スケジュール
PHPの各バージョンのリリースプロセスでは、リリースマネージャがリリースの指揮・管理を行います。リリースマネージャは、ベテラン1名とルーキー2名の合計3名から構成されます。PHP 8。5のリリースマネージャの内、ベテランはPHP 8.2/8.3のリリースマネージャであったPierrick Charron氏に決まり、ルーキーについては候補者4名から2名を選定する投票が進んでいます。
リリースマネージャの決定後、リリースに向けたプロセスが開始されます。2025年11月20日が一般公開日として設定されています。今後、7月に3回のα版がリリースされた後、リリース版に取り込む機能を決定するフィーチャーフリーズが8月に行われます。8月から9月にかけて3回のベータ版がリリースされ、その後、9月から11月にかけて4回のリリース候補版がリリースされます。リリース候補版で問題が発生しなければ、予定通り、11月20日に一般公開が行われます。
PHP 8。5に向けて新たな機能の提案が既に行われており、投票で採択された提案の実装が行われています。本連載では、PHP 8.5で実装される予定の主な機能について紹介していきます。
スタティックプロパティの非対称な可視性
クラスのプロパティに関して非対称な可視性がPHP 8.4で導入されました。しかし、スタティックプロパティに関しては、この機能はサポートされていませんでした。PHP 8.5では、スタティックプロパティに関して、非対称な可視性が指定できるようになります。早速、簡単な例を見てみましょう。以下の例では、クラスExampleを定義し、スタティックプロパティ変数$titleを定義しています。この変数は非対称な可視性を有しており、読み出しはpublic、書き込みはprivateに設定されています。この変数の設定はスタティックメソッドchangeNameを介して行うことができます。
class Example {
public private(set) static string $title = ‘Example class’;
public static function changeName(string $name): void {
self::$title = $name;
}
}
print Example::$title; // 出力: Example class
Example::changeName(‘New name’);
print Example::$title; // 出力: New name
Example::$title = ‘Nope’; // エラー発生
8行目でプロパティ変数$titleの内容を出力していますが、読み出しはpublicのため、出力が正常に行われます。9行目でchangeNameメソッドによりプロパティ変数$titleの内容を更新します。この場合、クラス内でprivateアクセスは許可されるため、正常に更新が行われます。
次にプロパティ変数$titleを出力すると、更新後の値が出力されます。11行目で、プロパティ変数$titleの値を直接することを試みていますが、書き込みはprivateと設定されているため、以下のようなエラーを発生します。
Fatal error: Uncaught Error: Cannot modify private(set) property Example::$title from global scope
クラスのプロパティ変数の可視性を読み出し(取得)と書き込み(設定)について独立に設定できる機能により、クラス変数へのアクセスの自由度を向上させることができます。PHP 8。5においてスタティック変数でこの機能がサポートされたことにより、より便利になることが期待されます。
戻り値が重要であることを示すアノテーションの導入
PHP 8.5では、関数・メソッドの戻り値が重要であり、無視できないことを示すアノテーション #[\NoDiscard] が導入されます。開発者が戻り値を無視するコードを記述した場合、警告が発生します。以下の関数bulk_processを見てみましょう。この関数は、配列を入力パラメータとし、ループ処理を行いますが、一定の確率(この場合は30%)で処理が失敗し、例外を発生します。例外は入力配列の値をキーとする配列として戻り値で返されます。処理が成功したケースでは、エラー値はヌルとなります。この関数には、#[\NoDiscard]アノテーションを付与しています。
#[\NoDiscard(“as processing might fail for individual items”)]
function bulk_process(array $items): array {
$results = [];
foreach ($items as $key => $item) {
if (\random_int(0、 99) < 70) { // 70%の確率で成功
echo “Processing {$item}”、 PHP_EOL;
$error = null;
} else {
$error = new \Exception(“Failed to process {$item}。”);
}
$results[$key] = $error;
}
return $results;
}
次にパラメータ配列を入力としてこの関数を実行してみましょう。
$items = [ ‘foo’、 ‘bar’、 ‘baz’ ];
bulk_process($items);
この場合、戻り値が取得されていないため、以下のような警告を発生します。
Warning: The return value of function bulk_process() should either be used or intentionally ignored by casting it as (void)、 as processing might fail for individual items
警告を発生しないコードは以下となります。
$results = bulk_process($items);
(void)bulk_process($items);
(bool)bulk_process($items);
1行目は戻り値を取得しているため、警告を発生しません。2行目および3行目は、戻り値を取得していませんが、voidおよび論理値(bool)にキャストしているため、警告の発生は抑制されます。
関数の戻り値を確認する処理を期待する場合、#[\NoDiscard]アノテーションを付与することで、その意図が反映されやすくなることが期待されます。
今回は、次期マイナーバージョンであるPHP 8.5に関する情報として、リリースに向けたプロセスの状況と、主な変更点のいくつかを紹介しました。今回紹介した機能以外にも新たな機能の導入や変更が予定されており、次回以降で紹介する予定です。