Комментарии (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 => 'Высокий',
};
}
}
Ключевые рекомендации
- Для простых случаев используйте
array_column(Enum::cases(), 'value') - Для сложных сценариев добавляйте методы прямо в enum
- Разделяйте логику — значения (values) и отображаемые метки (labels) могут отличаться
- Используйте match выражения для преобразования значений в читаемые метки
- Рассмотрите интерфейсы если нужна стандартизация поведения разных 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' => 'В обработке', ...]
Такой подход обеспечивает типобезопасность, повторное использование кода и легкое поддержание системы меток для перечислений. Выбор конкретного метода зависит от требований проекта и сложности логики отображения значений.