Як використовувати Enum у PHP 8

Фундаментальна особливість багатьох мов, перерахування тепер також є частиною PHP.

Перерахування (enum) — це тип даних, який можна використовувати для зберігання значення з настроюваного набору. Вони ідеально підходять для відображення варіантів, які ви можете відобразити в розкривному списку.

PHP 8.1 представив підтримку перерахувань. Ці переліки прості у використанні, але вони пропонують додаткові функції, запозичені з об’єктно-орієнтованого програмування.

Що роблять ENUM

Перерахування корисні, коли потрібно працювати з фіксованим набором пов’язаних значень. Наприклад, ви можете використовувати enum для представлення мастей у колоді карт або типів транспортних засобів.

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

Основні ENUM

Enum зазвичай зберігають скалярні значення. Вони аналогічні примітивним типам даних C, хоча переліки PHP можуть зберігати як рядкові значення, так і цілі числа. Однак за замовчуванням перераховані значення PHP не мають скалярного еквівалента. Вони відомі як основні перерахування:

 enum Season
{
    case Spring;
    case Summer;
    case Autumn;
    case Winter;
}

Зверніть увагу, як PHP повторно використовує ключове слово case, яке ви також зустрінете в операторах switch. Значення, які представляє цей перелік, є просто назвами випадків. Ви можете посилатися на конкретне значення enum за допомогою такого синтаксису:

 EnumTypeName::EnumField 

Наприклад, для позначення зими використовуйте:

 Season::Winter 

Ви можете призначити це значення змінній і порівняти його з іншими значеннями сезону:

 $favorite = Season::Summer;
 
if ($favorite == get_current_season()) {
    echo "It's my favorite season!";
}

Використовуючи підказку типу, ви можете обмежувати параметри або повертати типи до певного переліку. Це допомагає уникнути цілого набору помилок і загалом робить ваш код більш придатним для обслуговування:

 function get_current_season(): Season
{
    $day = date("z");
 
    if ($day < 59 || $day > 333) return Season::Winter;
    if ($day < 151) return Season::Spring;
    if ($day < 243) return Season::Summer;
    if ($day < 334) return Season::Autumn;
}

Якби ця функція get_current_season спробувала повернути щось інше, ніж Season, PHP викликав би фатальну помилку TypeError.

Підкріплені Enum

PHP використовує термін «захищений перелік» для позначення переліку зі значеннями. Це можуть бути цілі числа або рядки:

 enum Month: int
{
    case Jan = 1;
    case Feb = 2;
    //...
}


Вам потрібно оголосити тип резервного переліку, і він має бути або int, або string.

Ви можете отримати доступ до базового значення за допомогою властивості значення лише для читання:

 echo Month::Jan->value; 

Коли ви використовуєте резервні переліки, ви також можете перетворити їх з їхнього еквівалентного скалярного значення за допомогою методу from:

 var_dump(Month::from(2)); 

Методи перерахування

Переліки PHP також можуть мати методи, що робить їх трохи схожими на скорочений клас. Це відображає позицію PHP як щось середнє між процедурною мовою та об’єктно-орієнтованою.

Наприклад, ви можете додати цей простий метод до переліку Month, щоб отримати кількість днів із певного значення:

 /* Note: no leap-year handling! */
function daysInMonth(): int {
    if ($this == Month::Feb) return 28;
    if (in_array($this, array(Month::Apr, Month::Jun, Month::Sep, Month::Nov))) return 30;
    return 31;
}

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

Перечисления також підтримують статичні методи. Вірно, вони вам не понадобляться, але вони можуть бути корисними, якщо вам потрібно написати що-то, що працює як конструктор, наприклад:

 static function random(): Month {
    return Month::from(rand(1, count(Month::cases())));
}

Перерахування є загальною особливістю багатьох мов, у тому числі предка PHP, C. Вони є однією з головних функцій випуску 8.1, завдяки чому мова зрівняється зі швидкістю багатьох її конкурентів.

PHP уже має багато функцій, які роблять його придатним для веб-розробки. У міру того, як мова розвивається, вона продовжує запозичувати в інших і також інновувати оригінальні функції.