PHP入門:列挙型(Enum)について -vol.3-

スポンサーリンク
PHP入門:列挙型(Enum)について -vol.3- 用語解説
PHP入門:列挙型(Enum)について -vol.3-
この記事は約5分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、PHPの列挙型(Enum)についてご紹介します。

スポンサーリンク

背景

PHP8.2を利用したAPIを開発しているときに列挙型(Enum)を利用したので、そのときの調査内容を備忘としてのこしました。

こちらのサイトを参考にしています。

列挙型(Enum)列挙型定数

列挙型(Enum)には、列挙型定数を含めることができます。これらの定数は public、private、または protected であることができますが、実際のところ、継承が許可されていないため、private と protected は同等です。

列挙型定数は列挙型ケースを参照できます。例えば:

enum Size
{
    case Small;
    case Medium;
    case Large;

    public const Huge = self::Large;
}

この例では、列挙型 Size には SmallMediumLarge という3つのケースと、Huge という列挙型定数が含まれています。Huge の値は self::Large に設定されています。つまり、HugeLarge のケースを参照しています。

列挙型(Enum)Traits

列挙型(Enum)は、クラスと同様に、トレイトを活用することができます。ただし、列挙型で使用されるトレイトにはプロパティを含めることはできません。トレイトはメソッドと静的メソッドのみを含めることができます。プロパティを含むトレイトは致命的なエラーを引き起こします。

例えば:

interface Colorful
{
    public function color(): string;
}

trait Rectangle
{
    public function shape(): string {
        return "Rectangle";
    }
}

enum Suit implements Colorful
{
    use Rectangle;

    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;

    public function color(): string
    {
        return match($this) {
            Suit::Hearts, Suit::Diamonds => 'Red',
            Suit::Clubs, Suit::Spades => 'Black',
        };
    }
}

この例では、列挙型 SuitRectangle というトレイトを使用しています。Rectangle トレイトは shape() メソッドを提供しており、Suit 列挙型はそのメソッドを継承して利用しています。このように、トレイトを使用することで、列挙型に共通のメソッドを提供することができます。

列挙型(Enum)定数

列挙ケースは列挙型自体の定数として表現されるため、ほとんどの定数式で静的な値として使用できます。例えば、プロパティのデフォルト値、静的変数のデフォルト値、パラメーターのデフォルト値、クラスおよびグローバルの定数値などです。ただし、他の列挙型ケースの値で使用することはできず、通常の定数は列挙型ケースを参照できます。

ただし、静的または定数の定義内でArrayAccessなどの暗黙のマジックメソッド呼び出しは許可されていません。そのため、結果の値が確定的であるか、メソッドの呼び出しに副作用がないことを絶対に保証できないためです。関数呼び出し、メソッド呼び出し、プロパティアクセスは、引き続き定数式では無効な操作です。

以下は具体例です:

// これは完全に合法なEnumの定義です。
enum Direction implements ArrayAccess
{
    case Up;
    case Down;

    public function offsetGet($val) { ... }
    public function offsetExists($val) { ... }
    public function offsetSet($val) { throw new Exception(); }
    public function offsetUnset($val) { throw new Exception(); }
}

class Foo
{
    // これは許可されています。
    const Bar = Direction::Down;

    // これは許可されません、これは確実でない可能性があるためです。
    const Bar = Direction::Up['short'];
    // 致命的なエラー: 定数式で列挙型の [] を使用できません
}

// これは完全に合法で、定数式ではありません。
$x = Direction::Up['short'];

この例では、列挙型 DirectionArrayAccess インターフェースを実装しています。クラス Fooconst BarDirection::Down を参照することができますが、Direction::Up['short'] を参照しようとすると、定義が確実でないため、エラーが発生します。ただし、$x のように定数式ではない場所で Direction::Up['short'] を使用することは許可されています。

おわりに

今日は、PHPの列挙型(Enum)についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました