はじめに
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"
// }