PHP 8.2 のリリース予定日は 2022-12-08 であり(2022-11-11 に延期のお知らせがありました)、ひと月を切りました。PHP 8.2 の追加機能、変更点の中からピックアップして私的に使いそうな機能を 2 つ、影響がありそうな変更を 2 つ紹介します。
使いそうな機能の一つ目は型の中で AND と OR を同時に使える様になる機能です。これは次の RFC にあります。
これを使うことで次の様により正確にデータを表現できます
function findUserOrMakeGuest(array $condition): User | (NotifyContract & AuthenticatableContract)
{
// ユーザーを見つけるか、
// ユーザーっぽくふるまうために必要なインターフェースを満たすクラスのインスタンスを返す
}
二つ目は trait 内に定数を定義できるようになる機能です。
PHP: rfc:constants_in_traits
これを使うことで次の様により凝集したコードを書けます。これは trait の中でのみ使う定数が欲しくなった時、特に役に立ちます。
<?php
trait StateLogTo {
const URL_PREFIX = 'https://ログ用のAPIのURLの前置詞';
public function info(){
logg_api_post(self::URL_PREFIX.'/info', $this);
}
}
この二つは普段の業務でも使いどころが多そうです。後はもしかしたら readonly クラスも使うやもしれません。どこかから読み取ったリソースを格納するクラスに readonly 属性を使うことで不意の変更を防ぐ使い方が思いつきます。
影響がありそうな変更点の一つ目は動的なプロパティの追加の非推奨化です。これは次の様にクラス内で宣言していないプロパティを後からインスタンスに追加した場合に発生する警告の追加です。これは PHP 9.0 でエラー例外が投げられて強制停止する様になります。
PHP: rfc:deprecate_dynamic_properties
<?php
// @see https://wiki.php.net/rfc/deprecate_dynamic_properties
// 下記は↑リンクより引用したコードです。
class User {
public $name;
}
$user = new User;
// 宣言済みのプロパティUser::$nameに代入をします。
$user->name = "foo";
// name の打ち間違いで nene としたとします:
$user->nane = "foo";
// PHP <= 8.1: 静かに動的に $user->nane プロパティを作成します。
// PHP 8.2: 非推奨の警告が発生しますが、動的に $user->nane プロパティは作成されます.
// PHP 9.0: Error 例外が投げられます。
変更点の二つ目は文字列中における値の展開方法の制限です。次の様に${, }でくくって文字列中に変数の値を埋め込むことができなくなります
PHP: rfc:deprecate_dollar_brace_string_interpolation
"${foo}"; // 動的プロパティ同様に 9.0 になったらエラーになります。
PHP8.2 はこれまでに比べて変更が小さめな印象です。動的プロパティや文字列中の変数展開の手癖が${変数名}な場合は大変かもしれませんが、そうでない場合は8.1と然程変わらない感覚で使用できそうです。