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

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

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

作成日: 更新日:

基本的な使い方

getBackingTypeメソッドは、PHPのReflectionEnumクラスに属し、列挙型(enum)のバッキング型を取得するメソッドです。このメソッドは、PHP 8.1以降で導入された列挙型の詳細な情報をプログラムの実行中に調べることができるリフレクション機能の一部として提供されています。

列挙型には、単に名前だけを持つ「純粋な列挙型」と、int型またはstring型の具体的な値を各ケースに割り当てることができる「バッキング型を持つ列挙型」の二種類があります。getBackingTypeメソッドは、対象の列挙型が「バッキング型を持つ列挙型」である場合に、そのバッキング型がintであるかstringであるかを、それぞれの型名を示す文字列(例: 'int' または 'string')として返します。

もし、検査対象の列挙型がバッキング型を持たない「純粋な列挙型」である場合は、このメソッドはnullを返します。これにより、開発者は実行時に列挙型がどのような内部的な型で値を保持しているかを動的に判断し、それに基づいた適切な処理を実装することができます。例えば、列挙型の値の型に応じて異なるバリデーションやデータ変換を行う場合などに有用です。システム開発において、列挙型の柔軟な取り扱いを可能にする重要な手段となります。

構文(syntax)

1<?php
2
3// バッキング型を持つ列挙型(Enum)を定義します。
4// この例では 'string' をバッキング型としています。
5enum Suit: string
6{
7    case Hearts = 'H';
8    case Diamonds = 'D';
9    case Clubs = 'C';
10}
11
12// ReflectionEnumクラスのインスタンスを作成し、定義した列挙型を調べます。
13$reflectionEnum = new ReflectionEnum(Suit::class);
14
15// getBackingType() メソッドを呼び出して、列挙型のバッキング型情報を取得します。
16// 戻り値は ReflectionNamedType オブジェクトか、バッキング型がない場合は null です。
17$backingType = $reflectionEnum->getBackingType();
18
19?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?ReflectionNamedType

このメソッドは、Enumの基底となる型を表すReflectionNamedTypeオブジェクト、または基底型が存在しない場合はnullを返します。

サンプルコード

PHP Enumのバッキング型を取得する

1<?php
2
3// PHP 8.1以降で利用可能な列挙型(Enum)を定義します。
4// この列挙型は 'int' をバッキング型として持ちます。
5// ReflectionEnum::getBackingType() メソッドは、この列挙型に定義されたバッキング型に関する情報を取得します。
6enum UserRole: int
7{
8    case ADMIN = 1;
9    case EDITOR = 2;
10    case VIEWER = 3;
11}
12
13// ReflectionEnum オブジェクトを生成します。
14// これにより、UserRole 列挙型に関するメタデータにプログラムからアクセスできるようになります。
15$reflectionEnum = new ReflectionEnum(UserRole::class);
16
17// getBackingType() メソッドを呼び出して、列挙型のバッキング型情報を取得します。
18// 戻り値は ReflectionNamedType オブジェクト(バッキング型がある場合)または null(バッキング型がない場合)です。
19$backingType = $reflectionEnum->getBackingType();
20
21// バッキング型が存在するかどうかを確認します。
22if ($backingType !== null) {
23    // ReflectionNamedType オブジェクトから、バッキング型名(例: "int" または "string")を取得します。
24    $typeName = $backingType->getName();
25
26    echo "列挙型 '" . $reflectionEnum->getName() . "' のバッキング型は '" . $typeName . "' です。" . PHP_EOL;
27
28    // キーワード 'php gettype' に関連付けて、取得した型名が文字列であることを示します。
29    // gettype() 関数は、指定された変数のデータ型を文字列として返します。
30    echo "取得したバッキング型名 ('" . $typeName . "') のデータ型: " . gettype($typeName) . PHP_EOL;
31
32} else {
33    // バッキング型が定義されていない列挙型の場合のメッセージです。
34    // (例: enum Color { case RED; } のように、コロンで型指定がない場合)
35    echo "列挙型 '" . $reflectionEnum->getName() . "' はバッキング型を持ちません。" . PHP_EOL;
36}
37
38?>

このPHPコードは、PHP 8.1で導入された「列挙型(Enum)」の内部情報をプログラム的に調べる方法を示しています。特に、ReflectionEnum::getBackingType()メソッドを使って、列挙型が定義している「バッキング型」の情報を取得することに焦点を当てています。

最初に、UserRole: intのように、intをバッキング型として持つ列挙型UserRoleを定義します。バッキング型とは、列挙型の各要素(ADMINなど)が内部でどのようなデータ型(整数や文字列など)として扱われるかを指定するものです。

次に、new ReflectionEnum(UserRole::class)によってReflectionEnumオブジェクトを作成します。このオブジェクトは、UserRole列挙型に関する詳細なメタデータにアクセスするための窓口となります。

そして、$reflectionEnum->getBackingType()メソッドを呼び出します。このメソッドは引数を一切取りません。戻り値は、列挙型がバッキング型を持っている場合、その型に関する情報を持つReflectionNamedTypeオブジェクトを返します。バッキング型が定義されていない場合はnullを返します。ReflectionNamedTypeオブジェクトからは、getName()メソッドを使って、バッキング型がintやstringといった具体的な型名として取得できます。

コードでは、取得したバッキング型情報が存在するかを確認し、$backingType->getName()で「int」という型名を取り出して表示しています。また、gettype()関数を用いて、取り出された型名("int"という文字列)自体のデータ型が「string」であることを示しており、プログラミング上での型の扱い方を具体的に確認できます。これにより、列挙型の構造を深く理解し、動的に情報を取得・活用する方法を学ぶことができます。

このサンプルコードはPHP 8.1以降で利用可能な「列挙型(Enum)」のバッキング型に関する情報を取得する方法を示しています。getBackingType()メソッドは、列挙型がintやstringなどのバッキング型を持つ場合にReflectionNamedTypeオブジェクトを返し、バッキング型を持たない場合はnullを返します。そのため、メソッドの戻り値がnullでないかを必ず確認し、バッキング型が存在する場合にのみgetName()で型名を取得するようにしてください。取得されるバッキング型名(例えば"int"や"string")は、文字列として扱われます。gettype()関数は、このような変数の実際のデータ型を文字列で確認したい場合に役立ちます。古いPHPバージョンでは実行できないためご注意ください。

PHP Enumのバッキング型を取得する

1<?php
2
3/**
4 * Backed Enum(バッキング型を持つ列挙型)の例。
5 * 文字列型(string)をバッキング型として持ちます。
6 */
7enum Status: string
8{
9    case Active = 'active';
10    case Inactive = 'inactive';
11    case Pending = 'pending';
12}
13
14/**
15 * Pure Enum(バッキング型を持たない列挙型)の例。
16 * 特定の型をバッキング型として持ちません。
17 */
18enum Role
19{
20    case Admin;
21    case User;
22    case Guest;
23}
24
25/**
26 * 指定されたEnumクラスのバッキング型情報を表示します。
27 *
28 * @param string $enumClassName リフレクションを行うEnumクラスの完全修飾名
29 */
30function demonstrateEnumBackingType(string $enumClassName): void
31{
32    echo "--- 列挙型: '{$enumClassName}' のバッキング型情報 ---\n";
33
34    try {
35        // ReflectionEnumクラスを使ってEnumの情報を取得します。
36        $reflectionEnum = new ReflectionEnum($enumClassName);
37
38        // getBackingType() メソッドで、Enumが持つバッキング型を取得します。
39        // Backed Enumの場合はReflectionNamedTypeオブジェクト、Pure Enumの場合はnullが返されます。
40        $backingType = $reflectionEnum->getBackingType();
41
42        if ($backingType === null) {
43            // バッキング型がない場合(Pure Enum)
44            echo "この列挙型はPure Enum(純粋な列挙型)であり、バッキング型を持ちません。\n";
45        } else {
46            // バッキング型がある場合(Backed Enum)
47            echo "この列挙型はBacked Enum(バッキング型を持つ列挙型)であり、以下のバッキング型を持ちます。\n";
48            // getName() メソッドでバッキング型の名前(例: 'int', 'string')を取得します。
49            echo "  - 型の名前: " . $backingType->getName() . "\n";
50            // isBuiltin() メソッドで、その型がPHPの組み込み型(int, stringなど)かどうかを判定します。
51            echo "  - PHPの組み込み型か: " . ($backingType->isBuiltin() ? "はい" : "いいえ") . "\n";
52        }
53    } catch (ReflectionException $e) {
54        // 列挙型が見つからないなどのエラーが発生した場合
55        echo "エラー: 列挙型 '{$enumClassName}' のリフレクションに失敗しました。 " . $e->getMessage() . "\n";
56    }
57    echo "\n";
58}
59
60// Status Enum(Backed Enum)のバッキング型情報を表示します
61demonstrateEnumBackingType(Status::class);
62
63// Role Enum(Pure Enum)のバッキング型情報を表示します
64demonstrateEnumBackingType(Role::class);
65
66?>

ReflectionEnum::getBackingTypeは、PHP 8で導入された列挙型(Enum)が、どのようなデータ型を背後に持っているか(バッキング型)を調べるためのメソッドです。このメソッドはReflectionEnumクラスに属しており、PHPのリフレクション機能を利用して、プログラムの実行中に列挙型の詳細な構造を検査できます。

このメソッドは引数を取りません。戻り値は、列挙型が整数型や文字列型などの具体的なデータ型と紐付いている「Backed Enum(バッキング型を持つ列挙型)」である場合、その型情報を表すReflectionNamedTypeオブジェクトを返します。このオブジェクトからは、バッキング型の名前(例えばstringやint)や、それがPHPの組み込み型であるかどうかの情報を取得できます。一方、列挙型が特定のデータ型と紐付かない「Pure Enum(純粋な列挙型)」である場合、このメソッドはnullを返します。

サンプルコードでは、Statusという文字列型をバッキング型に持つBacked Enumと、バッキング型を持たないPure EnumであるRoleの例を用いています。Statusに対してgetBackingType()を実行すると、string型を示すReflectionNamedTypeオブジェクトが返され、その名前や組み込み型であることが確認できます。Roleに対して実行するとnullが返され、バッキング型がないことがわかります。このように、列挙型の種類を判別し、そのバッキング型に関する詳細な情報を動的に取得することが可能です。

このコードは、PHP 8.1以降のEnum(列挙型)のバッキング型を動的に調べます。ReflectionEnum::getBackingType()は、文字列や整数型を持つ『Backed Enum』なら型情報(ReflectionNamedTypeオブジェクト)を、型を持たない『Pure Enum』ならnullを返します。戻り値がnullかどうかでEnumの種類を判断できる点が重要です。リフレクションは実行時にクラス情報を検査する高度な機能のため、指定したEnumが見つからないとReflectionExceptionが発生します。プログラムの安定性を保つため、try-catchによる例外処理を必ず実装してください。

関連コンテンツ

関連プログラミング言語