Задать вопрос
@mafia8

Как сделать объект enum, если есть строка-вариант?

Как получить объект enum, если есть строка-вариант $string?
enum Dire {
  case Left;
  case Right;
}
$string='Left';
$var=Dire::Left; // надо так, только через $string
  • Вопрос задан
  • 255 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Stepik
    PHP (pro)
    1 месяц
    Далее
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Добавлю способы
enum Dire: string {
    case Left = 'Left';
    case Right = 'Right';
}

$string = 'Left';
$const = Dire::class . '::' . $string;
$var = defined($const) ? constant($const) : null;
var_dump($var); // enum(Dire::Left)


enum Dire: string {
    case Left = 'Left';
    case Right = 'Right';
    public static function tryFromName(string $name): ?self
    {
        foreach (self::cases() as $case) {
            if ($case->name === $name) {
                return $case;
            }
        }
        return null;
    }
}

$string = 'Left';
$var = Dire::tryFromName($string);
var_dump($var); // enum(Dire::Left)

Ну и через рефлексию
enum Dire: string {
    case Left = 'Left';
    case Right = 'Right';
}

$string = 'Left';
$refEnum = new ReflectionEnum(Dire::class);
$var = $refEnum->hasCase($string) ? $refEnum->getConstant($string) : null;
var_dump($var);  // enum(Dire::Left)
Ответ написан
Комментировать
@rPman
начиная с 8.3 Dynamic class constant fetch
$var = Dire::{$string};

upd. для старее версии:
$var = constant(Dire::class . '::' . $string);

и само собой вариант с eval (не рекомендую, если $string не проверять на эксплоиты, но заработает в совсем уж любых версиях)
$var = eval('return Dire::' . $string . ';');
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Через tryFrom

enum Dire: string {
    case Left = 'Left';
    case Right = 'Right';
}

$string = 'Left';
$var = Dire::tryFrom($string);


https://www.php.net/manual/en/backedenum.tryfrom.php
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы