Перечисления

Конспект в доработке

    Перечисления

    Enums - классы, все его возможные случаи это объекты, разрешают определять настраиваемый тип, который ограничен одним значением из дискретного числа возможных, что позволяет определенной модели сделать неверные состояния недопустимыми
    Самый популярный пример перечислений, встроенный логический тип, который допускает значения true и false
    Перечисления работают с теми же пространствами имен, что и другие классы, интерфейсы и трейты
    Перечисления определяют новый тип с фиксированным ограниченным количеством возможных допустимых значений
    Тип варианта без связанных данных называется "Чистый вариант" ( Pure Case )
    Перечисление, которое содержит только чистые варианты, называется чистым перечислением (Pure Enum)
    У всех вариантов есть доступное только для чтения свойство name — это и чувствительное к регистру имя самого варианта
    Suit::Spades->name;

    #Создадим новый тип перечислений test #Переменным используемым данный тип, может быть присвоен один из 4-х допустимых типов значений enum Test { case Test1; case Test2; case Test3; case Test4; } #Функция может проверить тип аргумента на соответствие типу перечислений #Передать функции можно только одно из допустимых типов значений function use_test(Test $test) { var_dump($test); echo "<br>"; echo $test->name; } $val = Test::Test1; use_test($val);
    Типизированные перечисления

    По умолчанию у вариантов перечислений нет скалярного эквивалента, это обычные одноэлементные объекты, но иногда полезно иметь встроенный скалярный эквивалент определенный внутри, это может помочь когда вариантам перечислений нужно обращаться к базе данных или аналогичному хранилищу данных
    Вариант со скалярным эквивалентом называется типизированным (Backed Case), поскольку он «поддержан» более простым значением. Перечисление, у которого все варианты типизированные, называется «типизированным перечислением» (Backed Enum). Типизированное перечисление может содержать только типизированные варианты. Чистое перечисление может содержать только чистые варианты
    Типизированное перечисление может поддерживаться типами int или string и такое перечисление поддерживает только один тип за раз (то есть нельзя объединять int|string). Если перечисление помечено как имеющее скалярный эквивалент, тогда все варианты должны иметь определённый явно уникальный скалярный эквивалент. Не существует автоматически генерируемых скалярных эквивалентов (например, последовательных целых чисел). Типизированные варианты должны быть уникальными; двум вариантам типизированного перечисления не может принадлежать один и тот же скалярный эквивалент
    Эквивалентные значения должны быть строками или строковыми выражениями. Константы и постоянные выражения не поддерживаются. То есть 1 + 1 разрешено, а 1 + SOME_CONST — нет
    Типизированные перечисления реализуют внутренний интерфейс BackedEnum, который даёт два дополнительных метода:
    from(int|string): self возьмёт скаляр и вернёт вариант перечисления, которому он принадлежит
    tryFrom(int|string): ?self возьмёт скаляр и вернёт вариант перечисления, которому он принадлежит

    enum Suit: string { case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } #У типизированных вариантов есть дополнительное доступное только для чтения свойство value echo suit::Clubs->value; # C echo "<br>"; var_dump(Suit::from('C')); # enum(Suit::Clubs) $suit = Suit::from('D'); echo "<br>"; echo $suit->value; # D
    Методы перечислений

    Перечисления могут содержать методы и реализовывать интерфейсы
    Если перечисления реализуют интерфейс, то любая проверка типа этого интерфейса примет все варианты этого перечисления
    В типизированных перечислениях объявление интерфейса идёт после объявления типа перечисления. Пример:
    enum Suit: string implements Colorful

    interface Colorful { public function color(): string; } enum Suit implements Colorful { case Hearts; case Diamonds; case Clubs; case Spades; public function color(): string { #Присвоение значения return match($this) { Suit::Hearts, Suit::Diamonds => 'Красный', Suit::Clubs, Suit::Spades => 'Черный' }; } public function shape(): string { return "Ractangle"; } } function paint( Colorful $c ) { var_dump($c); } echo Suit::Hearts->name . "<br>"; paint(Suit::Clubs); print Suit::Diamonds->shape(); # Ractangle echo "<br>"; echo Suit::Diamonds->color(); echo "<br>"; var_dump(Suit::Diamonds);
    Статические методы

    В перечислениях разрешено объявлять статические методы и служат как альтернативные конструкторы

    enum Size { case Small; case Medium; case Large; public static function fromLength(int $cm): static { return match(true) { $cm < 50 => static::Smal, $cm < 100 => static::Medium, default => static::Large, }; } } var_dump(Size::Medium::fromLength(70));
    Источники
    Последнее изменение: 20.11.2024 07:36


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ