Основы перечислений

Перечисления похожи на классы и используют те же пространства имён, что и классы, интерфейсы и трейты. Они также могут быть загружены автоматически. Перечисления определяют новый тип, который имеет фиксированное ограниченное количество возможных допустимых значений.

<?php
enum Suit
{
case
Hearts;
case
Diamonds;
case
Clubs;
case
Spades;
}
?>

Это объявление создаёт новый перечислимый тип с именем Suit, у которого четыре и только четыре допустимых значения: Suit::Hearts, Suit::Diamonds, Suit::Clubs и Suit::Spades. Переменным может быть присвоено одно из этих допустимых значений. Тип функции может быть проверен на соответствие типу перечисления и в этом случае могут быть переданы только значения этого типа.

<?php
function pick_a_card(Suit $suit) { ... }

$val = Suit::Diamonds;

// OK
pick_a_card($val);
// OK
pick_a_card(Suit::Clubs);
// TypeError: pick_a_card(): Argument #1 ($suit) must be of type Suit, string given
pick_a_card('Spades');
?>

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

Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы.

По умолчанию варианты не поддерживаются скалярным значением. То есть Suit::Hearts не равно "0". Вместо этого каждый вариант поддерживается одноэлементным объектом с таким именем. Это означает, что:

<?php
$a
= Suit::Spades;
$b = Suit::Spades;

$a === $b; // true

$a instanceof Suit; // true
?>

Это также означает, что значения перечисления никогда не являются < или > друг с другом, поскольку эти сравнения не имеют смысла для объектов. Сравнения всегда будут возвращать false при работе с вариантами перечисления.

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

Все чистые варианты реализованы как экземпляры своего типа перечисления. Тип перечисления внутренне представлен как класс.

У всех обращений есть свойство, доступное только для чтения, name, которое является именем самого варианта, чувствительным к регистру.

<?php
print Suit::Spades->name;
// prints "Spades"
?>

Также можно использовать функции defined() и constant() для проверки существования или чтения регистра перечисления, если имя получено динамически. Однако это не рекомендуется, так как для большинства случаев использования перечислений лучше использовать Типизированные перечисления.