Техническое обслуживание этого проекта поддерживается через Tidelift.
Во-первых, и это главное, SplEnum
не интегрирован в PHP, вам придется устанавливать расширение отдельно.
Использование перечисления вместо констант класса дает следующие преимущества:
Вы можете использовать перечисление в качестве типа параметра: function setAction(Action $action) {
Вы можете использовать перечисление в качестве типа возвращаемого значения: function getAction() : Action {
Вы можете обогатить перечисление методами (например, format
, parse
,…).
Вы можете расширить перечисление, чтобы добавить новые значения (сделайте перечисление final
чтобы предотвратить это).
Вы можете получить список всех возможных значений (см. ниже).
Этот класс Enum не предназначен для замены констант класса, а может использоваться только тогда, когда это имеет смысл.
composer require myclabs/php-enum
use MyCLabsEnumEnum;/** * Action enum * * @extends Enum<Action::*> */final class Action расширяет Enum {private const VIEW = 'просмотр';private const EDIT = 'редактировать'; }
$action = Action::VIEW();// или с динамическим ключом:$action = Action::$key();// или с динамическим значением:$action = Action::from($value);/ / или $action = новое действие($value);
Как видите, статические методы реализуются автоматически для обеспечения быстрого доступа к значению перечисления.
Одним из преимуществ по сравнению с использованием констант класса является возможность использовать перечисление в качестве типа параметра:
функция setAction(Action $action) {// ...}
__construct()
Конструктор проверяет наличие значения в перечислении.
__toString()
Вы можете echo $myValue
, он отобразит значение перечисления (значение константы)
getValue()
Возвращает текущее значение перечисления.
getKey()
Возвращает ключ текущего значения Enum.
equals()
Проверяет, равны ли экземпляры перечисления (возвращает true
, если значения перечисления равны, в противном случае false
)
Статические методы:
from()
Создает экземпляр Enum, проверяя наличие значения в перечислении.
Метод toArray()
Возвращает все возможные значения в виде массива (постоянное имя в ключе, постоянное значение в значении).
keys()
Возвращает имена (ключи) всех констант в классе Enum.
values()
Возвращает экземпляры класса Enum всех констант Enum (имя константы в ключе, экземпляр Enum в значении).
isValid()
Проверьте, действительно ли проверенное значение в наборе перечисления
isValidKey()
Проверьте, действителен ли тестируемый ключ в наборе перечисления
assertValidValue()
Утверждает, что значение действительно в наборе перечисления, в противном случае выдает исключение
search()
Возвращает ключ для искомого значения
последний класс Action расширяет Enum {private const VIEW = 'просмотр';private const EDIT = 'редактировать'; }// Статический метод:$action = Action::VIEW();$action = Action::EDIT();
Помощники статических методов реализуются с помощью __callStatic()
.
Если вас волнует автодополнение IDE, вы можете реализовать статические методы самостоятельно:
последний класс Action расширяет Enum {private const VIEW = 'view';/** * @return Action */public static function VIEW() {return new Action(self::VIEW); } }
или вы можете использовать phpdoc (например, это поддерживается в PhpStorm):
/** * @method static Action VIEW() * @method static Action EDIT() */final class Action расширяет Enum {private const VIEW = 'просмотр';private const EDIT = 'редактировать'; }
Встроенное перечисление появилось в PHP в версии 8.1: https://www.php.net/enumerations.
Если ваш проект работает под управлением PHP 8.1+ или ваша библиотека имеет его как минимальное требование, вам следует использовать его вместо этой библиотеки.
При переходе с myclabs/php-enum
усилия должны быть небольшими, если использование было рекомендованным способом:
частные константы
выпускные занятия
ни один метод не переопределен
Изменения для миграции:
Определение класса должно быть изменено с
/** * @method static Action VIEW() * @method static Action EDIT() */final class Action расширяет Enum {private const VIEW = 'просмотр';private const EDIT = 'редактировать'; }
к
действие перечисления: string {case VIEW = 'view';case EDIT = 'edit'; }
Все места, где класс использовался как тип, продолжат работать.
Использование и необходимые изменения:
Операция | myclabs/php-перечисление | собственное перечисление |
---|---|---|
Получение экземпляра изменится с | $enumCase = Action::VIEW() | $enumCase = Action::VIEW |
Создание перечисления из поддерживаемого значения | $enumCase = new Action('view') | $enumCase = Action::from('view') |
Получить поддерживаемое значение экземпляра перечисления | $enumCase->getValue() | $enumCase->value |
Сравните два экземпляра перечисления | $enumCase1 == $enumCase2 или $enumCase1->equals($enumCase2) | $enumCase1 === $enumCase2 |
Получить ключ/имя экземпляра перечисления | $enumCase->getKey() | $enumCase->name |
Получить список всех возможных экземпляров перечисления | Action::values() | Action::cases() |
Получите карту возможных экземпляров перечисления, сопоставленного по имени. | Action::values() | array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases()) или (new ReflectionEnum(Action::class))->getConstants() |
Получить список всех возможных имен перечисления | Action::keys() | array_map(fn($case) => $case->name, Action::cases()) |
Получить список всех возможных поддерживаемых значений перечисления | Action::toArray() | array_map(fn($case) => $case->value, Action::cases()) |
Получите карту возможных поддерживаемых значений перечисления, сопоставленного по имени. | Action::toArray() | array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases())) или array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants())) |
Родное перечисление PHP 8.1+
Отображение перечислений доктрины
Интеграция Symfony ParamConverter
Интеграция PHPStan