← Назад к вопросам

Как из enum получить список Label?

1.0 Junior🔥 101 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Получение списка значений (Labels) из Enum в PHP

В PHP enum (перечисления) появились в версии 8.1 и предоставляют удобный способ работы с типизированными константами. Для получения списка значений (labels) нужно понимать структуру enum и доступные методы.

Типы Enum в PHP

PHP поддерживает два типа enum:

1. Pure Enums (Чистые перечисления)

enum Status: string
{
    case PENDING = 'pending';
    case ACTIVE = 'active';
    case ARCHIVED = 'archived';
}

2. Backed Enums (Перечисления со значениями)

enum UserRole: int
{
    case ADMIN = 1;
    case EDITOR = 2;
    case VIEWER = —
}

Основные способы получения значений

Способ 1: Использование встроенных методов enum

Для получения всех вариантов (cases) используйте метод cases():

$allCases = Status::cases();

// Получение массива значений
$labels = array_map(
    fn($case) => $case->value, 
    $allCases
);

// Результат: ['pending', 'active', 'archived']

Способ 2: Для Backed Enums с методом value

enum Color: string
{
    case RED = 'Красный';
    case GREEN = 'Зеленый';
    case BLUE = 'Синий';
}

// Получение массива меток
$labels = array_column(Color::cases(), 'value');
// Результат: ['Красный', 'Зеленый', 'Синий']

Способ 3: Создание специализированного метода в enum

Наиболее гибкий подход — добавление метода непосредственно в enum:

enum ProductStatus: string
{
    case DRAFT = 'Черновик';
    case PUBLISHED = 'Опубликован';
    case DISABLED = 'Отключен';
    
    public static function labels(): array
    {
        return array_column(self::cases(), 'value', 'name');
    }
    
    public static function simpleLabels(): array
    {
        return array_map(
            fn($case) => $case->value,
            self::cases()
        );
    }
}

// Использование
$labels = ProductStatus::labels();
// Результат: ['DRAFT' => 'Черновик', 'PUBLISHED' => 'Опубликован', ...]

Продвинутые техники

Способ 4: Enum с методами для локализации

enum NotificationType: string
{
    case EMAIL = 'email';
    case SMS = 'sms';
    case PUSH = 'push';
    
    public function label(): string
    {
        return match($this) {
            self::EMAIL => 'Электронная почта',
            self::SMS => 'SMS сообщение',
            self::PUSH => 'Push уведомление',
        };
    }
    
    public static function allLabels(): array
    {
        return array_map(
            fn($case) => $case->label(),
            self::cases()
        );
    }
}

// Получение локализованных меток
$localizedLabels = NotificationType::allLabels();

Способ 5: Трейт для повторного использования

trait EnumLabelsTrait
{
    public static function getLabels(): array
    {
        $labels = [];
        
        foreach (self::cases() as $case) {
            $labels[$case->name] = method_exists($case, 'label') 
                ? $case->label() 
                : $case->value;
        }
        
        return $labels;
    }
}

enum Priority: int
{
    use EnumLabelsTrait;
    
    case LOW = 1;
    case MEDIUM = 2;
    case HIGH = 3;
    
    public function label(): string
    {
        return match($this) {
            self::LOW => 'Низкий',
            self::MEDIUM => 'Средний',
            self::HIGH => 'Высокий',
        };
    }
}

Ключевые рекомендации

  1. Для простых случаев используйте array_column(Enum::cases(), 'value')
  2. Для сложных сценариев добавляйте методы прямо в enum
  3. Разделяйте логику — значения (values) и отображаемые метки (labels) могут отличаться
  4. Используйте match выражения для преобразования значений в читаемые метки
  5. Рассмотрите интерфейсы если нужна стандартизация поведения разных enum

Пример комплексного решения

interface LabelableEnum
{
    public function label(): string;
    public static function labels(): array;
}

enum OrderStatus: string implements LabelableEnum
{
    case NEW = 'new';
    case PROCESSING = 'processing';
    case SHIPPED = 'shipped';
    case DELIVERED = 'delivered';
    case CANCELLED = 'cancelled';
    
    public function label(): string
    {
        return match($this) {
            self::NEW => 'Новый заказ',
            self::PROCESSING => 'В обработке',
            self::SHIPPED => 'Отправлен',
            self::DELIVERED => 'Доставлен',
            self::CANCELLED => 'Отменен',
        };
    }
    
    public static function labels(): array
    {
        $result = [];
        
        foreach (self::cases() as $case) {
            $result[$case->value] = $case->label();
        }
        
        return $result;
    }
}

// Использование
$statusLabels = OrderStatus::labels();
// Получаем: ['new' => 'Новый заказ', 'processing' => 'В обработке', ...]

Такой подход обеспечивает типобезопасность, повторное использование кода и легкое поддержание системы меток для перечислений. Выбор конкретного метода зависит от требований проекта и сложности логики отображения значений.

Как из enum получить список Label? | PrepBro