3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPの列挙型(Enum)の使い方をまとめたみた

Last updated at Posted at 2023-06-18

はじめに

PHP 8.1 から列挙型が使えるようになりました。

ぜひ使いこなせるようになりたいと思い、記事にまとめました。
ちなみに、これまでは laravel-enum のようなライブラリを用いて管理することが多かったです。

列挙型(Enum)とは?

公式には以下のように説明されています。

開発者は取りうる値を限定した独自の型を定義できます。 これによって、"不正な状態を表現できなくなる" ので、 ドメインモデルを定義する時に特に役立ちます。

つまり、各プロジェクトごとに必要となる独自の値を管理することができます。

Pure Enum
enum Pricing
{
    case Light;
    case Standard;
    case Premium;
}

echo Pricing::Standard->name;
// Standard

上記の例では Pricing::Light ≠ "0" であることに注意。配列のようなインデックスは設定されません。( case はシングルトンオブジェクトであるため)

列挙型に値を持たせたい場合は以下のように記述します。

Backed Enum
enum Pricing: int
{
    case Light = 1000;
    case Standard = 2000;
    case Premium = 3000;
}

echo Pricing::Standard->name;
// Standard
echo Pricing::Standard->value;
// 2000

使い方

case の一覧を取得する

cases() を用いると配列として取得できます。

var_dump(Pricing::cases());
// array(3) {
//   [0]=>
//   enum(Pricing::Light)
//   [1]=>
//   enum(Pricing::Standard)
//   [2]=>
//   enum(Pricing::Premium)
// }

値から case を取得する

tryFrom() を用います。不正な値が与えられた場合は NULL を返します。

$valid = Pricing::tryfrom(2000);
var_dump($valid);
// enum(Pricing::Standard)

$invalid = Pricing::tryfrom(1500);
var_dump($invalid);
// NULL

case と紐づく他の値を取得する(例:表示名)

列挙型にはメソッドを含めることができるので、case に応じて他の値を取得するメソッドを作成します。

enum Pricing: int
{
    case Light = 1000;
    case Standard = 2000;
    case Premium = 3000;

    public function text(): string
    {
        return match ($this) {
            Pricing::Light => 'お手軽プラン',
            Pricing::Standard => '標準プラン',
            Pricing::Premium => '特別プラン',
        };
    }
}

echo Pricing::Standard->text();
// 標準プラン

value => name の配列を取得する

static メソッドを作成します。今回は他の Enum でも使えるように Trait で作成してみました。

trait EnumSelectable
{
    public static function forSelect(): array
    {
        return array_combine(
            array_column(self::cases(), 'value'),
            array_column(self::cases(), 'name')
        );
    }
}

enum Pricing: int
{
    use EnumSelectable;

    case Light = 1000;
    case Standard = 2000;
    case Premium = 3000;
}

var_dump(Pricing::forSelect());
// array(3) {
//   [1000]=>
//   string(5) "Light"
//   [2000]=>
//   string(8) "Standard"
//   [3000]=>
//   string(7) "Premium"
// }
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?