phpday 2022

Основы перечислений

Перечисления похожи на классы и используют те же пространства имён, что и классы, интерфейсы и трейты. Они также могут быть загружены автоматически. Перечисления определяют новый тип, который имеет фиксированное ограниченное количество возможных допустимых значений.

<?php
enum Suit
{
    case 
Hearts;
    case 
Diamonds;
    case 
Clubs;
    case 
Spades;
}
?>

Это объявление создаёт новый перечислимый тип с именем Suit, у которого четыре и только четыре допустимых значения: Suit::Hearts, Suit::Diamonds, Suit::Clubs и Suit::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');
?>

Перечисление может иметь ноль или более вариантов case без ограничений. Перечисление без вариантов синтаксически корректно, хотя и бесполезно.

Для вариантов перечисления применяются те же правила синтаксиса, что и для любой метки в PHP, смотрите Константы.

По умолчанию варианты не поддерживаются скалярным значением. То есть Suit::Hearts не равно "0". Вместо этого каждый вариант поддерживается одноэлементным объектом с таким именем. Это означает, что:

<?php
$a 
Suit::Spades;
$b Suit::Spades;

$a === $b// true

$a instanceof Suit;  // true
?>

Это также означает, что значения перечисления никогда не являются < или > друг с другом, поскольку эти сравнения не имеют смысла для объектов. Сравнения всегда будут возвращать false при работе с вариантами перечисления.

Тип варианта без связанных данных называется "Чистый вариант". Перечисление, которое содержит только чистые варианты, называется чистым перечислением.

Все чистые варианты реализованы как экземпляры своего типа перечисления. Тип перечисления внутренне представлен как класс.

У всех обращений есть свойство, доступное только для чтения, name, которое является именем самого варианта, чувствительным к регистру.

<?php
print Suit::Spades->name;
// prints "Spades"
?>
add a note add a note

User Contributed Notes 1 note

up
8
sajjad.golchin
29 days ago
<?php

enum Colors
{
    case
Red;
    case
Blue;
    case
Green;

    public function
getColor(): string
   
{
        return
$this->name;
    }
}

function
paintColor(Colors $colors): void
{
    echo
"Paint : " . $colors->getColor() . PHP_EOL;
}

paintColor(Colors::Red);
paintColor(Colors::Green);
paintColor(Colors::Blue);

/*
    output :
    ------------------------
    Paint : Red
    Paint : Green
    Paint : Blue
*/
?>
To Top