如何在PHP中实现类似枚举的功能?
如何在PHP中实现类似枚举的功能?
这个问题已经在下面有答案了:
如何在PHP中使用类似Java和其他高级语言提供的Enum功能?我知道PHP目前不允许创建枚举,但最接近的方法是什么?
admin 更改状态以发布 2023年5月21日
这是 @Kris 代码的更新版本,更适用于较新版本的 PHP。它是基于 @lassombra 的评论制作的。
/** * Implements the abstract base for all enum types * @see http://stackoverflow.com/a/2324746/1003020 * @see http://stackoverflow.com/a/254543/1003020 * * Example of a typical enum: * * class DayOfWeek extends Enum * { * const Sunday = 0; * const Monday = 1; * const Tuesday = 2; * const Wednesday = 3; * const Thursday = 4; * const Friday = 5; * const Saturday = 6; * } * * Usage examples: * * $monday = DayOfWeek::Monday // (int) 1 * DayOfWeek::isValidName('Monday') // (bool) true * DayOfWeek::isValidName('monday', $strict = true) // (bool) false * DayOfWeek::isValidValue(0) // (bool) true * DayOfWeek::fromString('Monday') // (int) 1 * DayOfWeek::toString(DayOfWeek::Tuesday) // (string) "Tuesday" * DayOfWeek::toString(5) // (string) "Friday" **/ abstract class Enum { private static $constCacheArray = NULL; private static function getConstants() { if (self::$constCacheArray == NULL) { self::$constCacheArray = []; } $calledClass = get_called_class(); if (!array_key_exists($calledClass, self::$constCacheArray)) { $reflect = new \ReflectionClass($calledClass); self::$constCacheArray[$calledClass] = $reflect->getConstants(); } return self::$constCacheArray[$calledClass]; } public static function isValidName($name, $strict = false) { $constants = self::getConstants(); if ($strict) { return array_key_exists($name, $constants); } $keys = array_map('strtolower', array_keys($constants)); return in_array(strtolower($name), $keys); } public static function isValidValue($value, $strict = true) { $values = array_values(self::getConstants()); return in_array($value, $values, $strict); } public static function fromString($name) { if (self::isValidName($name, $strict = true)) { $constants = self::getConstants(); return $constants[$name]; } return false; } public static function toString($value) { if (self::isValidValue($value, $strict = true)) { return array_search($value, self::getConstants()); } return false; } }