この記事は個人ブログと同じ内容です
PHP: PHP 8.2.0 Release Announcement - php.net
PHP 8.2 が 2022 年 12 月 8 日に正式リリースされています。PHP 8.2 の新しい機能を使ってみようと思います。
読み取り専用クラス
クラスに対して 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 では型まわりや記法の改善や強化が多い印象でした。パフォーマンスも地道に改善が行われているようなので積極的に最新バージョンを使っていきたいですね。
現在 back check 開発チームでは一緒に働く仲間を募集中です。 herp.careers herp.careers herp.careers