PHP で簡易 Enum を実装する

php では java のように enum 型がないのですが、 やはり使いたい場合があります。

本格的に実装してもいいのですが、 そこまでするのも大げさだなぁ、という場合に リフレクションを使って簡単に実装する方法があります。

<?php
trait SimpleEnum
{
    public static function values()
    {
        $className = get_called_class();

        $refClass = new ReflectionClass($className);
        $values = $refClass->getConstants();

        return $values;
    }

    public static function valueOf($value, $notfound = null)
    {
        $values = self::values();
        if (!array_key_exists($value, $values)) return $notfound;
        return $values[$value];
    }
}

使い方

<?php
class TestEnum
{
    use SimpleEnum;

    const HOGE = 0;
    const FUGA = 1;
}

echo TestEnum::HOGE; // => 0
echo TestEnum::FUGA; // => 1

echo TestEnum::valueOf('FUGA'); // => 1
echo TestEnum::valueOf('UnDefined'); // => null
echo TestEnum::valueOf('UnDefined', 'undefined'); // => undefined

java みたく複数の値を定義したり、型検証できませんが、 ちょっと使う分にはこれでもいいかと。

trait を使ってますが、 class にして継承すれば 5.3 以下でも使えると思います。