Зачем нужен Enum в php?

Подскажите зачем нужны пакеты clabs/php-enum, spatie/enum или dbalabka/php-enumeration? В каких случаях их применять?


Ответы (1 шт):

Автор решения: UKRman

Для возможности работать с константам как с объектами, используется большынстве в ValueObject, к примеру:

Банальный пример - у нас єсть класс User со статусом.

class User
{
    private const ACTIVE  = 'active';
    private const WAIT    = 'wait';
    private const DELETE  = 'delete';
    private const ARCHIVE = 'archive';

    privat string $status;

    public function __construct()
    {
        $this->status = self::WAIT;
    }

    public function isActive(): bool
    {
         return $this->status === self::ACTIVE;
    }

    public function isWait(): bool
    {
         return $this->status === self::WAIT;
    }

    public function isDelete(): bool
    {
         return $this->status === self::DELETE;
    }

    public function isArchive(): bool
    {
         return $this->status === self::ARCHIVE;
    }

    public function activate(): void
    {
        $this->status = self::ACTIVE;
    }
}

$user = new User();

if (true === $user->isWait()) {
    $user->activate();
}

Наш клас разрастается и что не очень хорошо, если можно некоторые компоненты вынести в маленькие детали его сущности. С помощью библиотеки мы можем заделать со статуса EnumType и разгрузить клас User:

class User
{

    private Status $status;


    public function __construct(): bool
    {
        $this->status = Status::WAIT();
    }

    public function activate(): void
    {
        $this->status = Status::ACTIVE();
    }

    public function getStatus()
    {
        return $this->status;
    }

}


class Status extends Enum 
{
    public const ACTIVE  = 'active';
    public const WAIT    = 'wait';
    public const DELETE  = 'delete';
    public const ARCHIVE = 'archive';    

    public function isActive(): bool
    {
         retutn $this->is(self::ACTIVE);
    }

    public function isWait(): bool
    {
         retutn $this->is(self::WAIT);
    }

    public function isDelete(): bool
    {
         retutn $this->is(self::DELETE);
    }

    public function isArchive(): bool
    {
         retutn $this->is(self::ARCHIVE);
    }
}

$user = new User();

if (true === $user->getStatus()->isWait()) {
    $user->activate();
}

И откуда уже можно и получать списки всех констант для проверки и тд. Я собственно использую єту библиотеку но в связке с датамапером, к примеру как вод тут, в зависимости какой фреймвор, и что он может предложить. Суть в общем в том, чтобы работать с константным значениям как с объектом. Надеюсь я ответил на ваш вопрос.

→ Ссылка