PHP 8.2 の新機能を試してみよう
- 公開日
- カテゴリ:PHP
- タグ:PHP

PHP: PHP 8.2.0 Release Announcement - php.net
PHP 8.2 が 2022 年 12 月 8 日に正式リリースされています。PHP 8.2 の新しい機能を使ってみようと思います。
Contents
- 読み取り専用クラス
- DNF(Disjunctive Normal Form)型
- null, false, true が独立した型に
- トレイトで定数
- 動的なプロパティが非推奨に
- 文字列への ${} 形式での値の埋め込み
- Stack trace
読み取り専用クラス
クラスに対して readonly を指定できる。
- 宣言している全てのプロパティに対して readonly を指定したことになる
- 動的なプロパティの作成を禁止したことになる
- 以下のプロパティには readonly を指定できないため、そのプロパティを持つクラスは readonly にできない
- 型を指定していないプロパティ
- static プロパティ
- readonly を指定したクラスは子クラスでも readonly を指定した場合にのみ継承できる
- 以下のクラスは readonly にできない
- 列挙型
- trait
- interface
// PHP 8.2 以前
class Book
{
public function __construct(
private readonly string $title,
private readonly Author $author,
)
{
}
}
// ↓ ↓ ↓
// PHP 8.2
readonly class Book
{
public function __construct(
private string $title,
private Author $author,
)
{
}
}
// readonly を指定できないプロパティを持つクラスは readonly にできない
readonly class Author
{
public function __construct(
private $name,
)
{
}
}
// -> Fatal error: Readonly property Author::$name must have type
// readonly を指定したクラスは子クラスでも readonly を指定した場合にのみ継承できる
class MyBook extends Book
{
}
// -> Fatal error: Non-readonly class MyBook cannot extend readonly class Book
DNF(Disjunctive Normal Form)型
PHP RFC: Disjunctive Normal Form Types - php.net
交差型と union 型が組み合わせて使えるようになった。
- 組み合わせるときは交差型は括弧で囲む必要がある
DNF は Disjunctive Normal Form の略称で、「選言標準形」のこと。
選言標準形(せんげんひょうじゅんけい、英: Disjunctive normal form, DNF)は、数理論理学においてブール論理での論理式の標準化(正規化)の一種であり、連言節(AND)の選言(OR)の形式で論理式を表す。加法標準形、主加法標準形、積和標準形とも呼ぶ。正規形としては、自動定理証明で利用されている。
選言標準形 - wikipedia
interface aaa {}
class A implements aaa{}
class B {
public function __construct(
// DNF 型
public (A&aaa)|null $name,
)
{
}
}
null, false, true が独立した型に
null, false, true が、独立した型になった。
class User {}
interface UserFinder
{
function findUserByEmail(): User|null;
}
class AlwaysNullUserFinder implements UserFinder
{
function findUserByEmail(): null
{
return null;
}
}
トレイトで定数
トレイトで定数が定義できるようになった
- トレイトを使うクラスを通じて定数にアクセスできる
trait A
{
const FOO = 1;
}
class B
{
use A;
}
B::FOO;
// -> 1
A::FOO;
// -> Fatal error: Uncaught Error: Cannot access trait constant A::FOO
動的なプロパティが非推奨に
動的にプロパティを生成することは非推奨となった
class Book
{
public string $author;
}
$book = new Book();
$book->author = 'author'; // ok
$book->title = 'book';
// -> Deprecated: Creation of dynamic property Book::$title is deprecated
クラスにアトリビュート #[\AllowDynamicProperties] を付与すると動的なプロパティ生成が許可される
#[\AllowDynamicProperties]
class A
{
}
$a = new A();
$a->name = 'name'; // ok
stdClass ではまだ動的なプロパティ生成で警告は出ない
$user = new stdClass();
$user->name = 'name'; // ok
文字列への ${} 形式での値の埋め込み
${} 形式の文字列への値の埋め込みが非推奨になった。
$name = 'name';
$a = "$name test"; // ok
$a = "{$name} test"; // ok
$a = "${$name} test";
// -> Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead
$a = "{${$name}} test"; // ok
Stack trace
Stack trace の出力において、機密性の高いパラメータの出力を抑制できるようになった。
before: これまでは Stack trace にパラメータが出力されてしまっていた
class A
{
public function __construct(
private string $hoge,
private string $fuga,
)
{
throw new Exception();
}
}
$a = new A('hoge', 'fuga');
// -> Stack trace: ... A->__construct('hoge', 'fuga')
after: #[SensitiveParameter] アトリビュートを付与することで、Stack trace に出力されなくなる
class B
{
public function __construct(
private string $hoge,
#[SensitiveParameter] private string $fuga,
)
{
throw new Exception();
}
}
$b = new B('hoge', 'fuga');
// -> Stack trace: ... B->__construct('hoge', Object(SensitiveParameterValue))
まとめ
PHP 8.2 では型まわりや記法の改善や強化が多い印象でした。パフォーマンスも地道に改善が行われているようなので積極的に最新バージョンを使っていきたいですね。