Skip to content

Instantly share code, notes, and snippets.

@DarkVss
Created February 27, 2023 14:58
Show Gist options
  • Save DarkVss/241489a185ae4a256df5c20fe0dfd50b to your computer and use it in GitHub Desktop.
Save DarkVss/241489a185ae4a256df5c20fe0dfd50b to your computer and use it in GitHub Desktop.
PHP Enums before 8.1
abstract class BasicEnum {
    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);
    }
}

abstract class DaysOfWeek extends BasicEnum {
    const Sunday = 0;
    const Monday = 1;
    const Tuesday = 2;
    const Wednesday = 3;
    const Thursday = 4;
    const Friday = 5;
    const Saturday = 6;
}

/********* EXAMPLE *********/
var_dump(DaysOfWeek::isValidName('Humpday'));                  // false
var_dump(DaysOfWeek::isValidName('Monday'));                   // true
var_dump(DaysOfWeek::isValidName('monday'));                   // true
var_dump(DaysOfWeek::isValidName('monday', $strict = true));   // false
var_dump(DaysOfWeek::isValidName(0));                          // false

var_dump(DaysOfWeek::isValidValue(0));                         // true
var_dump(DaysOfWeek::isValidValue(5));                         // true
var_dump(DaysOfWeek::isValidValue(7));                         // false
var_dump(DaysOfWeek::isValidValue('Friday'));                  // false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment