enum(列挙型、PHP 8.1以降)は、固定された名前付き値の集合を持つ型を定義します——制約された選択肢の集合(ステータス、ロール、種別)に対して、クラス定数やマジック文字列を使う古いアプローチよりはるかに優れた型安全性を提供する、待ち望まれた機能です。
純粋な enum(名前付きケースだけ)
{
Active;
Inactive;
Pending;
}
= ::;
{}
(::);
();
純粋な enum は名前付きケースを定義します。型ヒントとして使うと、有効な値しか渡せないことが保証されます——任意の文字列/整数を渡すことによるバグを排除します。
enum Status: string { // "backed" by string values
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}
Status::Active->value; // 'active' — the backing value
Status::from('active'); // Status::Active — convert FROM the value
Status::tryFrom('bad'); // null if invalid (instead of throwing)
Status::cases(); // [Active, Inactive, Pending] — all cases
バック付き enumは各ケースをスカラー(文字列または整数)に関連付けます——データベースへの保存やシリアライズに便利で、値からの変換には from()/tryFrom() を、すべてのケースを列挙するには cases() を使います。
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
public function label(): string { // methods on the enum
return match($this) {
Status::Active => 'Active User',
Status::Inactive => 'Inactive User',
};
}
public function isActive(): bool {
return $this === Status::Active;
}
}
Status::Active->label(); // "Active User"
enum はメソッドを持つ(そしてインターフェースを実装する)ことができ、各ケースに振る舞いを付与できます——強力なドメインモデリングのツールになります。
// ❌ before enums — class constants or magic strings: no type safety, typo-prone
class Status { const ACTIVE = 'active'; const INACTIVE = 'inactive'; }
function setStatus(string $s) {} // accepts ANY string — "actve" typo compiles fine
enum(PHP 8.1以降)は、制約された値の集合に適切な型安全性をもたらす、重要で待ち望まれた機能です——そしてモダンなPHPコードベースが採用するにつれて、これを理解することはますます不可欠になっています。
enum 以前、開発者は固定された選択肢の集合(ステータス、ロール、種別、状態)をクラス定数や生の文字列/整数で表現していましたが、これは型安全性がなく(任意の文字列が受け入れられるため、"actve" のようなタイプミスも問題なくコンパイルされ実行時バグを引き起こした)、有効な値を制約する方法もありませんでした。
enum はこれを解決します。型ヒントとして使うと、enum は有効なケースしか渡せないことを保証し、無効な値を実行時バグとしてではなく型レベルで捕捉します——大きな安全性の向上です。バック付き enum(スカラー値を持つ)はデータベースやシリアライズときれいに統合され(変換には from()/tryFrom())、enum はメソッドを持てる(各ケースに振る舞いを付与する、例えば label() や isActive())ため、ドメインモデリングにおいて強力です。
純粋な enum とバック付き enum、それらのメソッド、そしてエラーを起こしやすい古い定数/文字列アプローチをどのように置き換えるかを理解することは、モダンで型安全なPHPを書く上で重要な知識です——enum は今や固定された値の集合をモデル化するための慣用的な方法であり、現在のフレームワークやアプリケーションで広く使われているため、これを習得することはモダンなPHPへの習熟と、無効な値によるバグのクラス全体を防ぐ、より安全で表現力があり自己文書化されたコードを書く能力を反映します。