🦴

php のpure enumとbackend enumって?

2023/08/20に公開

そもそも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が持てるスカラー値には制約があります。

  1. intまたはstringのスカラー値のみを持つことができる(bool, floatは不可)
  2. 単一の型のみを持つことができる(Union型は不可)
  3. スカラー値は全てユニークでなければならない。重複不可
  4. スカラー値はリテラルかリテラルを表す式でなければならない

また、以下の様にPure enumとBackend enumを混合することはできません。

<?php
enum Suit: string
{
    case Hearts;
    case Diamonds;
    case Clubs = 'C';
    case Spades = 'S';
}

それに加え、Backed Enum には、定数値の有無チェックのtry, tryFromなどのメソッドが用意されてます。今回は割愛しますが是非そちらについても調べてみてください。

https://www.php.net/manual/ja/language.enumerations.backed.php

Discussion