【PHP8.x】enum_exists関数の使い方

作成日: 更新日:

enum_exists関数は、指定された名前のenum(列挙型)が定義されているかどうかを確認する関数です。PHP 8.1で導入されたenumは、一連の定義済み定数をグループ化する機能を提供します。この関数を使用することで、実行時にenumの存在を動的に確認し、存在しないenumにアクセスしようとした際のエラーを未然に防ぐことができます。

具体的には、enum_exists関数は文字列型の引数を一つ受け取ります。この引数は、確認したいenumの名前(名前空間を含む完全修飾名)を表します。関数は、指定された名前のenumが定義されていればtrueを、定義されていなければfalseを返します。

enum_exists関数は、アプリケーションの初期化時や設定ファイルの読み込み時など、enumの存在に依存する処理を行う前に、enumが実際に定義されているかどうかを検証するために役立ちます。例えば、データベースからenum名を読み込み、そのenumに基づいて処理を分岐させるような場合に、enum_exists関数で事前にチェックすることで、存在しないenumにアクセスしようとするエラーを回避し、より堅牢なコードを作成できます。また、プラグインシステムなどで、外部から提供されるenumを利用する場合にも、そのenumが存在するかどうかを確認する用途で使用できます。

基本的な使い方

構文(syntax)

enum_exists ( string $enum, bool $autoload = true ) : bool

引数(parameters)

string $enum, bool $autoload = true

  • string $enum: 存在を確認したい列挙型(enum)の名前を指定する文字列
  • bool $autoload = true: 列挙型が定義されていない場合に自動的にロードを試みるかどうかを指定する真偽値。trueの場合は自動ロードを試みます。

戻り値(return)

bool

指定された名前の列挙型(enum)が、現在のPHPスクリプトに存在するかどうかを示します。存在する場合は true、存在しない場合は false を返します。

サンプルコード

PHPでEnumの存在を確認する

<?php

/**
 * トランプのスーツを表すBacked Enum
 *
 * PHP 8.1以降で利用可能な列挙型(enum)の例です。
 */
enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

/**
 * 指定されたenumとそのケース(値)が存在するかを確認し、結果を表示します。
 *
 * @param string $enumClassName チェックしたいenumのクラス名
 * @param string $caseName チェックしたいケース名
 * @return void
 */
function checkEnumAndCase(string $enumClassName, string $caseName): void
{
    // enum_exists() を使用して、指定された名前のenumが定義されているかを確認します。
    if (enum_exists($enumClassName)) {
        echo "OK: enum '{$enumClassName}' は存在します。" . PHP_EOL;

        // enumが存在する場合、次にそのenumに特定のケース(値)が存在するかを確認します。
        // enumのケースは内部的にクラス定数として扱われるため、defined()でチェックできます。
        $constantName = $enumClassName . '::' . $caseName;
        if (defined($constantName)) {
            echo "OK: ケース '{$caseName}' は '{$enumClassName}' に存在します。" . PHP_EOL;
        } else {
            echo "NG: ケース '{$caseName}' は '{$enumClassName}' に存在しません。" . PHP_EOL;
        }
    } else {
        echo "NG: enum '{$enumClassName}' は存在しません。" . PHP_EOL;
    }
    echo "----------------------------------------" . PHP_EOL;
}


// --- 実行例 ---

// 存在するenumと存在するケースをチェック
checkEnumAndCase(Suit::class, 'Hearts');

// 存在するenumと存在しないケースをチェック
checkEnumAndCase(Suit::class, 'Joker');

// 存在しないenumをチェック
checkEnumAndCase('Color', 'Red');

?>

PHPのenum_exists関数は、指定された名前のEnum(列挙型)が現在の環境に存在するかどうかを確認するために使用されます。この関数は、PHP 8.1以降で導入されたEnumが利用可能か、または特定のEnumが定義されているかを実行時にチェックする際に役立ちます。

引数には、確認したいEnumの完全修飾クラス名を文字列で渡します。例えば、サンプルコードのSuit::classのように指定します。オプションの第二引数$autoloadはデフォルトでtrueであり、指定されたEnumが見つからない場合にPHPのオートロード機構を試みるかどうかを制御します。戻り値は真偽値(bool)で、Enumが存在すればtrue、存在しなければfalseを返します。

サンプルコードでは、トランプのスーツを表すSuitというEnumが定義されています。checkEnumAndCase関数では、まずenum_existsを用いてSuitのようなEnumクラス自体がPHPに登録されているかを確認します。Enumが存在すると確認できた後、そのEnumに特定のケース(例えばHeartsJoker)が存在するかどうかは、enum_existsでは直接判断できません。Enumのケースは内部的にはクラス定数として扱われるため、defined()関数に「Enum名::ケース名」という形式の文字列を渡すことで存在をチェックしています。

実行例を通じて、存在するEnumと存在するケース、存在するEnumと存在しないケース、そして存在しないEnumをそれぞれチェックし、enum_existsdefinedを組み合わせることで、Enumとその中の特定のケースの両方を確実に存在確認できる方法が示されています。

enum_exists()は、指定された名前のenumが定義されているかどうかをチェックします。引数にはenumのクラス名を文字列で渡します。Suit::classのように::classを使うと、enumのクラス名を文字列として安全に取得できます。

enumの特定のケース(値)が存在するかどうかは、defined()関数でチェックする必要があります。enumのケースは内部的にクラス定数として扱われるためです。enum_exists()だけでは、ケースの存在確認はできません。

autoload引数は、指定されたenumがまだ読み込まれていない場合に、自動的に読み込むかどうかを制御します。デフォルトはtrueなので、通常は省略可能です。falseにすると、未定義のenumに対してはfalseが返ります。

PHPでEnumが存在するか確認する

<?php

/**
 * enum_exists 関数の使用例
 */

// Enum が存在するか確認する
if (enum_exists(MyEnum::class)) {
    echo "Enum MyEnum が存在します。\n";
} else {
    echo "Enum MyEnum が存在しません。\n";
}

// 存在しない Enum を確認する
if (!enum_exists("NonExistentEnum")) {
    echo "Enum NonExistentEnum は存在しません。\n";
} else {
    echo "Enum NonExistentEnum が存在します。\n";
}

// Enum の定義 (上記の例を動作させるために必要)
enum MyEnum {
    case VALUE1;
    case VALUE2;
}

?>

enum_exists関数は、指定されたEnum型が定義されているかどうかを確認するために使用されます。PHP 8.1で導入されたEnum型は、特定の値を事前に定義し、それ以外の値を受け付けないようにする機能です。この関数を利用することで、プログラム実行時にEnum型が存在するかどうかを動的に判断できます。

enum_exists関数は、第一引数にEnum型の名前を文字列で指定します。この名前空間を含んだ完全修飾名である必要があります(例: MyNamespace\MyEnum::class)。第二引数には、autoloadというオプションの引数があり、デフォルト値はtrueです。autoloadtrueの場合、Enum型が見つからなければ、自動的にクラスのオートローダーが呼び出され、Enum型の定義が試みられます。autoloadfalseの場合、オートローダーは呼び出されません。

戻り値はbool型で、Enum型が存在する場合はtrue、存在しない場合はfalseを返します。サンプルコードでは、まずMyEnumというEnum型が存在するかどうかを確認しています。存在する場合は「Enum MyEnum が存在します。」というメッセージが表示されます。次に、存在しないEnum型であるNonExistentEnumの存在を確認し、存在しないことを確認しています。enum MyEnumの定義は、enum_exists関数の使用例を動作させるために必須です。この関数を使用することで、Enum型を利用する前にその存在を確認し、エラーを未然に防ぐことができます。

enum_exists関数は、指定された名前のEnumが定義されているかどうかを確認するために使用します。引数にはEnumの完全修飾クラス名を文字列で渡します。MyEnum::classのように、::classを使うことでタイプミスを防ぎ、リファクタリング時の影響を軽減できます。

第2引数の$autoloadは、デフォルトでtrueに設定されています。これは、指定されたEnumがまだ読み込まれていない場合に、自動的に読み込みを試みることを意味します。falseに設定すると、自動読み込みは行われません。

Enumが存在しない場合にenum_existsfalseを返しますが、存在しないクラス名を渡すとエラーが発生する可能性があります。そのため、クラスが存在するかどうかを確認する場合には、class_exists関数を代わりに使うことを検討してください。

PHP Enumの存在チェックをする

<?php

/**
 * ユーザーの状態を表すEnum。
 *
 * PHP 8.1以降で導入されたEnumは、関連する定数をグループ化し、
 * 型安全性を提供します。
 */
enum UserStatus
{
    case Active;
    case Inactive;
    case Pending;
}

/**
 * アプリケーション設定を表すEnum。
 * バックドEnumとして文字列値を持ちます。
 */
enum AppConfig: string
{
    case DebugMode = 'debug';
    case ProductionMode = 'production';
}

/**
 * `enum_exists` 関数の基本的な使用例を示します。
 *
 * `enum_exists(string $enum, bool $autoload = true)` は、
 * 指定された名前のEnum型が定義されているかどうかを真偽値で返します。
 *
 * @return void
 */
function demonstrateEnumExists(): void
{
    echo "--- `enum_exists` 関数によるEnum型の存在チェック ---" . PHP_EOL;

    // 1. 存在するEnum型名を指定してチェック
    // 'UserStatus' というEnumが定義されているため、trueを返します。
    $userStatusExists = enum_exists('UserStatus');
    echo "Enum 'UserStatus' は存在しますか?: " . ($userStatusExists ? 'はい' : 'いいえ') . PHP_EOL; // 期待される出力: はい

    // 'AppConfig' というEnumも定義されているため、trueを返します。
    $appConfigExists = enum_exists('AppConfig');
    echo "Enum 'AppConfig' は存在しますか?: " . ($appConfigExists ? 'はい' : 'いいえ') . PHP_EOL; // 期待される出力: はい

    // 2. 存在しないEnum型名を指定してチェック
    // 'NonExistentEnum' は定義されていないため、falseを返します。
    $nonExistentEnumExists = enum_exists('NonExistentEnum');
    echo "Enum 'NonExistentEnum' は存在しますか?: " . ($nonExistentEnumExists ? 'はい' : 'いいえ') . PHP_EOL; // 期待される出力: いいえ

    echo PHP_EOL;
    echo "--- autoload 引数について ---" . PHP_EOL;
    echo "`enum_exists`関数の第二引数`$autoload`はデフォルトで`true`です。" . PHP_EOL;
    echo "これにより、指定されたEnumがまだロードされていない場合でも、PHPは自動的に対応するファイルを検索し、" . PHP_EOL;
    echo "そのEnumをロードしようと試みます。通常はこのデフォルト設定で問題ありません。" . PHP_EOL;
}

// 上記の関数を実行して、結果を出力します。
demonstrateEnumExists();

PHPのenum_exists関数は、指定された名前のEnum(列挙型)がアプリケーション内に定義されているかどうかを確認するために使用される関数です。この関数は、PHP 8.1以降で導入されたEnum型の存在チェックに利用できます。

第一引数$enumには、存在を確認したいEnum型の完全な名前を文字列で指定します。例えば、サンプルコードで定義されているUserStatusAppConfigといったEnumの名前を指定します。

第二引数$autoloadはオプションで、デフォルトはtrueに設定されています。この引数がtrueの場合、指定されたEnumがまだPHPによってロードされていない場合でも、PHPはオートロード機能を使ってそのEnumを定義しているファイルを自動的に検索し、ロードを試みます。特別な理由がない限り、通常はこのデフォルト設定のままで問題ありません。

enum_exists関数の戻り値はbool型です。指定された名前のEnum型が定義されていればtrueを、存在しなければfalseを返します。

サンプルコードでは、まずUserStatusAppConfigという二つのEnumを定義しています。enum_exists('UserStatus')enum_exists('AppConfig')の呼び出しは、これらのEnumが定義されているためtrue(「はい」)を返します。これに対し、定義されていないNonExistentEnumを指定したenum_exists('NonExistentEnum')の呼び出しは、false(「いいえ」)を返します。このように、この関数を使うことで、プログラムの実行中に特定のEnumが利用可能かどうかを動的に、かつ安全に確認できます。

enum_exists関数は、指定した名前のEnum型がPHPに定義されているかを真偽値で判定します。引数にはEnumの正確な名前を文字列で渡してください。大文字と小文字は区別されますので注意が必要です。この関数は、Enum型そのものの存在を確認するものであり、特定のEnumケース(例: UserStatus::Active)が存在するかどうかを直接チェックするものではありません。Enumケースの存在確認には別の方法が必要です。第二引数$autoloadはデフォルトでtrueであり、未定義のEnum型もファイルパスから自動で探し出そうとします。これにより、必要なEnumが事前にロードされていなくても適切に判定可能です。主に、動的にEnum型を扱う際の存在チェックに利用されます。

【PHP8.x】enum_exists関数の使い方 | いっしー@Webエンジニア