Полный цикл в digital

Перечисления enum в Php

По сути enum служит для улучшенного описания типов. Давайте рассмотрим пример без енумов и с ними. Допустим, у нас продаются машины трех цветов: красные, черные и белые.

Опишим функцию setColor() которая будет устанавливать цвет в классе который мы передадим аргументом:

class Car {
    private string $color;

    function setColor(string $color): string {
        $this->color = $color;
        return $this->color;
    }
}

$Car = new Car();
echo $Car->setColor("red");

Можно завести константы и объединить их в одном классе, чтобы явно видеть все варианты:

class Color {
    static $RED = "red";
    static $BLACK = "black";
    static $WHITE = "white";
}

class Car {
    private string $color;

    function setColor(string $color): string {
        $this->color = $color;
        return $this->color;
    }
}

$Car = new Car();
echo $Car->setColor(Color::$RED);

Второй вариант лучше, но здесь нужен не класс, а отдельный тип, этот тип называется enum.

Простой enum

В самом простом случае enum, описывается так:

enum Color {
    case red;
    case black;
    case white;
}

Описав такой тип, мы можем использовать его везде:

enum Color {
    case red;
    case black;
    case white;
}

class Car {
    private $color;

    function setColor(Color $color): object {
        $this->color = $color;
        return $this->color;
    }
}

$Car = new Car();
// ключ
echo $Car->setColor(Color::white)->name;
// объект
var_dump($Car->setColor(Color::white));

Enum со скалярами

Изначально значения enum представлены внутри объектами, но вы можете присвоить им какое-то значение:

enum Color: string {
    case red = 'Красный';
    case black = 'Черный';
    case white = 'Белый';
}

Обратите внимание на объявление типа в определении перечисления. Он указывает, что все значения перечисления имеют данный тип. Вы также можете сделать их целочисленными int. Обратите внимание, что разрешены только типы int и string, как значения перечисления.

enum Color: string {
    case red = 'Красный';
    case black = 'Черный';
    case white = 'Белый';
}

class Car {
    private $color;

    function setColor(Color $color): object {
        $this->color = $color;
        return $this->color;
    }
}

$Car = new Car();
// ключ
echo $Car->setColor(Color::white)->name;
// значение
echo $Car->setColor(Color::white)->value;
// объект
var_dump($Car->setColor(Color::white));

Enum методы

Перечисления могут содержать методы. Это очень мощная функция, особенно в сочетании с оператором match:

enum Color
{
    case red;
    case black;
    case white;

    public function color(): string
    {
        return match ($this) {
            Color::red => 'Красный',
            Color::black => 'Черный',
            Color::white => 'Белый'
        };
    }
}

$status = Color::red;
echo $status->color();

Можно использовать в перечислении self:

enum Color
{
    case red;
    case black;
    case white;

    public function color(): string
    {
        return match ($this) {
            self::red => 'Красный',
            self::black => 'Черный',
            self::white => 'Белый'
        };
    }
}

$status = Color::red;
echo $status->color();

Enum интерфейсы

Перечисления могут реализовывать интерфейсы, как и обычные классы:

interface HasColor
{
    public function color(): string;
}

enum Color implements HasColor
{
    case red;
    case black;
    case white;

    public function color(): string
    {
        return match ($this) {
            Color::red => 'Красный',
            Color::black => 'Черный',
            Color::white => 'Белый'
        };
    }
}

$status = Color::red;
echo $status->color();

Enum трейты

Перечисления могут использовать трейты, как и обычные классы:

trait HasColor
{
    public function color(): string
    {
        return match ($this) {
            Color::red => 'Красный',
            Color::black => 'Черный',
            Color::white => 'Белый'
        };
    }
}

enum Color
{
    use HasColor;

    case red;
    case black;
    case white;
}

$status = Color::red;
echo $status->color();
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!