Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】BackedEnum::cases()メソッドの使い方

casesメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

casesメソッドは、PHP 8.1で導入されたBackedEnumクラスに属し、その列挙型が持つすべてのケース(メンバー)を配列として取得するために実行するメソッドです。

BackedEnumは、intやstringといった具体的な値(バッキング値)を持つ列挙型であり、このメソッドは、その列挙型に定義されているすべてのケース(定数メンバー)のインスタンスを順番に含んだ配列を返します。例えば、あるステータスを表す列挙型が「PENDING」「PROCESSING」「COMPLETED」といったケースを持つ場合、cases()メソッドを呼び出すと、これらの各ケースに対応する列挙型インスタンスが格納された配列が得られます。

この機能は、プログラム内で特定の列挙型に存在するすべての選択肢を動的に一覧表示したい場合や、すべてのケースに対して共通の処理を繰り返したい場合に非常に役立ちます。開発者が列挙型の利用可能な全メンバーを簡単に参照し、安全かつ効率的に列挙型を扱うための基本的なツールの一つとして設計されています。

構文(syntax)

1<?php
2
3enum MyBackedEnum: string
4{
5    case MemberOne = 'one';
6    case MemberTwo = 'two';
7}
8
9$allCases = MyBackedEnum::cases();

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

BackedEnumインターフェースを実装した列挙型(Enum)の全てのケースを、そのケース名(キー)とケースの値(バリュー)の連想配列として返します。

サンプルコード

PHP enum cases を配列で取得する

1<?php
2
3// PHP 8.1 以降で利用可能な、バックアップ値を持つ列挙型(Backed Enum)を定義します。
4// Backed Enum は、int または string のスカラー値をバックアップ値として持ちます。
5enum StatusCode: int
6{
7    case OK = 200;
8    case BadRequest = 400;
9    case NotFound = 404;
10    case InternalServerError = 500;
11}
12
13// BackedEnum クラスの静的メソッド `cases()` を呼び出し、
14// その列挙型に定義されている全てのケースを配列として取得します。
15// このメソッドは引数を取りません。
16$allStatusCodes = StatusCode::cases();
17
18echo "StatusCode Enum の全てのケース:\n";
19
20// 取得した配列をループ処理し、各ケースの情報(名前とバックアップ値)を表示します。
21foreach ($allStatusCodes as $case) {
22    // 各要素は列挙型インスタンスであり、`name` プロパティでケースの名前、
23    // `value` プロパティでそのバックアップ値にアクセスできます。
24    echo "- ケース名: " . $case->name . ", バックアップ値: " . $case->value . "\n";
25}
26

PHP 8.1以降の「バックアップ値を持つ列挙型(Backed Enum)」は、定数名に加えて、整数や文字列のスカラー値を関連付ける機能です。本サンプルコードでは、HTTPステータスコードを整数値として持つStatusCodeというBacked Enumを定義しています。

StatusCode::cases()は、このBacked Enumに定義されている全てのケースを効率的に取得する静的メソッドです。引数は不要で、呼び出すと、各列挙型ケースのインスタンスを要素とする配列が戻り値として返されます。

取得した配列$allStatusCodesforeachでループ処理すると、各列挙型ケースのインスタンスにアクセスできます。各インスタンスからは、nameプロパティでケースの名前(例: OK)、valueプロパティでそのバックアップ値(例: 200)を取り出せます。これは、定義された全列挙型ケースの情報を動的に取得し、プログラムで利用する際に大変有用です。

このコードは、PHP 8.1以降で導入された列挙型(enum)のcases()メソッドを利用しています。cases()は、列挙型に定義された全てのケースを、その列挙型のインスタンスを要素とする配列として返します。このメソッドは引数を必要としません。特に、このサンプルは各ケースにintstringの値を紐付けるBacked Enumを使っているため、返された各インスタンスからはnameプロパティでケース名、valueプロパティで紐付けられた値にアクセスできます。valueプロパティはBacked Enumでのみ利用可能ですのでご注意ください。古いPHPバージョンではenum自体が未対応のため、このコードは動作しません。実行環境のPHPバージョンを必ずご確認ください。

PHP Enum BackedEnum::cases() で全ケースを取得する

1<?php
2
3/**
4 * BackedEnum の利用例として、注文ステータスを表す列挙型を定義します。
5 * PHP 8.1 以降で利用可能な機能です。
6 */
7enum OrderStatus: string
8{
9    case PENDING = 'pending';
10    case COMPLETED = 'string';
11    case CANCELLED = 'cancelled';
12
13    /**
14     * Enum の値に基づいて、より詳細な説明を返すメソッド。
15     * これは `cases()` メソッドの使用とは直接関係ありませんが、Enum の一般的な使い方を示します。
16     *
17     * @return string
18     */
19    public function getDescription(): string
20    {
21        return match ($this) {
22            self::PENDING => '注文は処理待ちです。',
23            self::COMPLETED => '注文は完了しました。',
24            self::CANCELLED => '注文はキャンセルされました。',
25        };
26    }
27}
28
29/**
30 * BackedEnum::cases() メソッドを使用して、Enum の全てのケースを取得し、表示するサンプルです。
31 */
32function demonstrateBackedEnumCases(): void
33{
34    echo "--- OrderStatus Enum の全ケース ---" . PHP_EOL;
35
36    // OrderStatus 列挙型の全てのケース(インスタンス)を配列として取得します。
37    // BackedEnum::cases() は引数を取りません。
38    $allCases = OrderStatus::cases();
39
40    // 取得した各ケースについて、名前と値、そして説明を表示します。
41    foreach ($allCases as $case) {
42        // 各ケースの「名前」(定義された定数名)を取得します。
43        echo "名前: " . $case->name . PHP_EOL;
44
45        // 各ケースの「値」(バックアップされたスカラ値)を取得します。
46        echo "値: " . $case->value . PHP_EOL;
47
48        // Enum 内で定義したメソッドを使って、ケースの説明を表示します。
49        echo "説明: " . $case->getDescription() . PHP_EOL;
50        echo "--------------------------" . PHP_EOL;
51    }
52}
53
54// サンプルコードを実行します。
55demonstrateBackedEnumCases();
56
57?>

PHP 8.1以降で導入されたenum(列挙型)は、複数の状態を定数として管理する際に役立つ機能です。このサンプルコードは、特にバックアップ型列挙型(BackedEnum)に焦点を当て、その中のcases()メソッドの利用方法を具体的に示しています。

BackedEnum::cases()メソッドは、引数を一切取らず、呼び出された列挙型に定義されている全てのケース(列挙子)を配列として取得するために使用されます。戻り値は、各ケースのインスタンスが格納された配列です。

このサンプルコードでは、注文の状態を表すOrderStatusという列挙型を定義しています。demonstrateBackedEnumCases()関数内でOrderStatus::cases()を呼び出すことで、PENDINGCOMPLETEDCANCELLEDといった全ての注文ステータスのケースが配列として取得されます。その後、取得した配列をループ処理し、各ケースのnameプロパティから定義された名前(例: 'PENDING')を、valueプロパティからバックアップされた値(例: 'pending')をそれぞれ取得して表示しています。これにより、列挙型の全ての要素をプログラム的に扱い、その名前と値にアクセスする方法を理解することができます。複数の状態を扱うシステムにおいて、動的に全ケースを取得し処理する際に非常に便利なメソッドです。

このサンプルコードで利用されている列挙型(Enum)は、PHP 8.1以降で導入された機能です。cases()メソッドは、定義された列挙型の全てのケース(インスタンス)を配列として取得するために使用します。取得した各ケースはオブジェクトであり、$case->nameで列挙子の名前を、$case->valueで関連付けられたバックアップ値を取得できます。cases()メソッドは引数を取りませんので、常に列挙型名::cases()のように呼び出してください。これにより、固定された選択肢を安全かつ網羅的に扱うことができます。

関連コンテンツ