Эмуляция Enum, но с доп. методами. Корректно ли?

129
02 июля 2021, 10:50

В языке C# есть перечисления (enum). Удобная вещь, чтобы не заводить магические числа/строки/значения. Я решил сделать подобное на PHP. Сделал это в виде класса с константами. Например так:

class ColorEnum {
    const RED = 'red';
    const GREEN = 'green';
    const BLUE = 'blue';
}

Но проблема заключается в том, что для большинства этих классов перечислений я должен показывать пользователю их наименования на русском, например если это какой-нибудь dropdown в форме или карточке детальной информации об объекте (выбранный цвет: красный). Из-за этого в каждый класс перечисления мне приходится добавлять метод, который возвращает словарь, с ключом константы и значением-на русском:

class ColorEnum {
    const RED = 'red';
    const GREEN = 'green';
    const BLUE = 'blue';
    private static $colorsMap = [self::RED => 'Красный', self::GREEN => 'Зелёный', self::BLUE => 'Синий'];
    public static function getColorsMap():array {
        return self::$colorsMap;
    }
}

Как итог: я потерял "чистоту" и смысл перечислений (как мне кажется).

Вопрос: при текущих задачах правильно ли я сделал или нужно класс перечислений оставлять "чистым", а методы и словари ключ-значение для пользователя где-то как-то еще формировать? Где и как?

Answer 1

Самый красивый способ который мне известен

class ColorEnum
{
    const RED = 'red';
    const GREEN = 'green';
    const BLUE = 'blue';
    public static function getColor(): array
    {
        return [
            self::RED => 'Красный',
            self::GREEN => 'Зелёный',
            self::BLUE => 'Синий',
        ];
    }
}
READ ALSO
Не выполняется php из консоли Ubuntu

Не выполняется php из консоли Ubuntu

Запускаю из консоли php файл на выполнение, но никакого результата нетОшибку не выдаёт никакую, но и код не выполняется

100
Вывод данных из таблицы в разные блоки div class

Вывод данных из таблицы в разные блоки div class

Нужно вывести значения из таблицы в один div блок, где две заметки (картинка, название, краткое описание и тд

121
Дублирование адреса через htaccess

Дублирование адреса через htaccess

Предположим имеются ссылки такого вида:

110