Хорошие новости! В 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 с каждой версией становится все лучше и лучше. Приятно наблюдать за этим и пользоваться современным языком программирования.