Basic enumerations

Оновлено: 09.05.2023

Зчислення подібні до класів і мають ті самі простори імен, що й класи, інтерфейси та риси. Вони також завантажуються так само, як і класи. Зчислення визначає новий тип, який має фіксовану, обмежену кількість допустимих значень.

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

Ця декларація створює новий перечислюваний тип з іменем Suit, який має чотири і тільки чотири легальних значення: Масть::Черва, Масть::Бубна, Масть::Трефа і Масть::Піка. Змінним можна присвоювати одне з цих значень. Функція може бути перевірена на тип перечислюваного типу, у цьому випадку їй можуть бути передані тільки значення цього типу.

<?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');
?>

Перерахування може мати нульовий або більше визначень регістру, без максимального. Зчислення з нульовим регістром є синтаксично коректним, хоча і марним.

Для випадків перерахування застосовуються ті самі правила синтаксису, що й для будь-яких міток у 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"
?>