🦴
php のpure enumとbackend enumって?
そもそもEnumとは何か?
PHP8.1の 公式ドキュメント では列挙型(Enum)に関して以下のように説明されています。
列挙型(Enumerations) または Enum を使うと、 開発者は取りうる値を限定した独自の型を定義できます。 これによって、"不正な状態を表現できなくなる" ので、 ドメインモデルを定義する時に特に役立ちます。
簡単に言うと、 関連する定数をひとまとめにしておくことができるのこと。
PHPにおけるEnumの種別
スカラー値の情報を持たないEnumをPure Enum
スカラー値の情報を持つEnumをBacked Enum
※phpでのスカラー値とは数字、文字列、論理知、論理値の値のこと
Pure Enum
<?php
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
デフォルトのEnumではスカラー値の情報を持っていません。
Backed Enum
<?php
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
?>
特徴は、case式が右辺にスカラー値を持たせることが可能なことです。
Backed Enumが持てるスカラー値には制約があります。
- intまたはstringのスカラー値のみを持つことができる(bool, floatは不可)
- 単一の型のみを持つことができる(Union型は不可)
- スカラー値は全てユニークでなければならない。重複不可
- スカラー値はリテラルかリテラルを表す式でなければならない
また、以下の様にPure enumとBackend enumを混合することはできません。
<?php
enum Suit: string
{
case Hearts;
case Diamonds;
case Clubs = 'C';
case Spades = 'S';
}
それに加え、Backed Enum には、定数値の有無チェックのtry, tryFromなどのメソッドが用意されてます。今回は割愛しますが是非そちらについても調べてみてください。
Discussion