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 以下でも使えると思います。