/** * Основной метод получения экземпляра енума */ protected static function inst() { $trace = debug_backtrace(0, 2)[1]; //Из стека получим информацию о классе, функции и аргументах вызова $class = $trace['class']; //$trace = PsUtil::getClassFirstCall($class); $name = $trace['function']; $unique = "{$class}::{$name}"; //Проверим в кеше if (array_key_exists($unique, self::$_INSTS_)) { return self::$_INSTS_[$unique]; } //Устанавливаем признак создания экземпляра self::$_NOW_CREATE_ = $unique; //Аргументы вызова $args = func_get_args(); //Создаём экземпляр $inst = new $class($unique, $name); //Сбросим признак self::$_NOW_CREATE_ = null; //Сохраняем его в кеш self::$_INSTS_[$unique] = $inst; //Вызовем функцию init для наполнения полей класса call_user_func_array(array($inst, 'init'), $args); //Возвращаем экземпляр return $inst; }
/** * Возвращает свойство по названию * * @return PsTableColumnProps */ public static function valueOf($name) { //TODO - вынести в PsEnum return $name instanceof PsTableColumnProps ? $name : parent::valueOf($name); }