Перечисления 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();