PHP 8.1 Enum

Хорошие новости! В PHP появился тип Enum. Многие наверняка знакомы с таким типом данных в MySQL. Ранее, чтобы в php коде обрабатывать данные данного типа из БД, приходилось либо вовсе работать со строками (в самом плохо случае) либо описывать константы и объединять в классы. Однако проверка типов в этих случаях не работала как надо. Ведь все еще передать как аргумент в какой-либо метод можно любую строку вместо корректного значения. Чтобы заставить работать проверку типов как надо появились даже пакеты.

Так, например, прекрасным вариантом работы с Enum в PHP мог быть пакет bensampo/laravel-enum:

<?php

namespace App\Enums;

use BenSampo\Enum\Enum;

final class UserType extends Enum
{
    const Administrator = 0;
    const Moderator = 1;
    const Subscriber = 2;
    const SuperAdministrator = 3;
}
$admin = UserType::fromValue(UserType::Administrator);

$admin->is(UserType::Administrator);   // true
$admin->is($admin);                    // true
$admin->is(UserType::Administrator()); // true

$admin->is(UserType::Moderator);       // false
$admin->is(UserType::Moderator());     // false
$admin->is('random-value');            // false

//...

function canPerformAction(UserType $userType)
{
    if ($userType->is(UserType::SuperAdministrator)) {
        return true;
    }

    return false;
}

$userType1 = UserType::fromValue(UserType::SuperAdministrator);
$userType2 = UserType::fromValue(UserType::Moderator);

canPerformAction($userType1); // Returns true
canPerformAction($userType2); // Returns false

Теперь необходимость в таких пакетах будет сходить на нет. Потому что теперь можно так:

<?php
enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case 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');
?>

Enum представляет собой специализированный класс со своими методами. Можно добавлять свои методы, реализовывать интерфейсы и использовать traits. Подробнее можно почитать в документации.

Также хочу обратить внимание на пакет archtechx/enums, который приносит некоторые дополнительные удобства при использовании Enum php 8.1:

  • Invokable cases — получает конкретное значение обратившись к имени варианта Enum как к методу
  • Names — получение списка имен вариантов Enum
  • Values — получение списка значений вариантов Enum
  • Options — получение ассоциативного массива с именами и значениями Enum

PHP с каждой версией становится все лучше и лучше. Приятно наблюдать за этим и пользоваться современным языком программирования.

Leave a Reply

Ваш адрес email не будет опубликован.