Skip to content

vjik/php-enum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Реализация перечисляемого типа (enum) на PHP

Абстрактный класс Enum позволяет создавать enum-объекты (см. перечисляемый тип).

Установка

Рекомендуется установка через composer:

composer require vjik/php-enum

Определение класса

Вариант 1. Базовый

use vjik\enum\Enum;

class Status extends Enum
{
    const DRAFT = 'draft';
    const PUBLISH = 'publish';
}

Вариант 2. С именами

Массив с данными задаётся в статической функции items().

use vjik\enum\Enum;

class Status extends Enum
{
    const DRAFT = 'draft';
    const PUBLISH = 'publish';
    
    public static function items()
    {
        return [
            self::DRAFT => 'Черновик',
            self::PUBLISH => 'Опубликован',
        ];
    }
}

Вариант 3. С дополнительными данными

Для всех дополнительных данных необходимо прописать свойства proteсted.

use vjik\enum\Enum;

class Status extends Enum
{
    const DRAFT = 'draft';
    const PUBLISH = 'publish';
    
    protected $priority;
    
    public static function items()
    {
        return [
            self::DRAFT => [
                'name' => 'Черновик',
                'priority' => -10,
            ],
            self::PUBLISH => [
                'name' => 'Опубликован',
                'priority' => 20,
            ]
        ];
    }
}

Создание объекта

$status = new Status(Status::DRAFT);

Список значений toValues

Возвращает массив значений объекта. Поддерживает фильтрацию.

Status::toValues(); // ['draft', 'publish']
Status::toValues(['priority' => 20]); // ['publish']

Список с названиями toList

Возвращает массив вида $value => $name. Поддерживает фильтрацию.

Status::toList(); // ['draft' => 'Черновик', 'publish' => 'Опубликован']
Status::toList(['priority' => 20]); // ['publish' => 'Опубликован']

Массив с данными toArray

Возвращает массив вида:

[
    $value => [
        'name' => $name,
        'value' => $value,
        'param1' => $param1,
        'param2' => $param2,
        …
    ],
    …
]

Поддерживает фильтрацию.

Status::toArray();
Status::toArray(['priority' => 20]); // ['publish' => 'Опубликован']

Массив объектов toObjects

Возвращает массив вида:

[
    $value => Enum,
    …
]

Проверка значения isValid

Проверяет, существует ли значение в перечисляемом типе. Поддерживает фильтрацию.

Status::isValid('new'); // false
Status::isValid('publish'); // true
Status::isValid('publish', [['<', 'priority', 5]]); // false

Фильтрация

Методы toValues, toList, toArray, toObjects, isValid поддерживают фильтрацию.

Фильтр передаётся в виде массива:

[
    $key => $value,
    [$operator, $key, $value],
    …
]

Поддерживаемые операторы: =, !=, >, <, >=, <=.

Геттеры

Геттер — это метод, чьё название начинается со слова get. Часть названия после get определяет имя свойства. Например, геттер getAbsPriority определяет свойство absPriority, как показано в коде ниже:

use vjik\enum\Enum;

class Status extends Enum
{
    const DRAFT = 'draft';
    const PUBLISH = 'publish';
    
    protected $priority;
    
    protected function getAbsPriority()
    {
        return abs($this->priority);
    }
    
    public static function items()
    {
        return [
            self::DRAFT => [
                'name' => Черновик',
                'priority' => -10,
            ],
            self::PUBLISH => [
                'name' => 'Опубликован',
                'priority' => 20,
            ]
        ];
    }
}

$status = new Status(Status::DRAFT);
echo $status->absPriority; // 10

Преобразование в строку

Объект поддерживает преобразование в строку (магический метод __toString). Возвращается значение в виде строки.

$status = new Status(Status::DRAFT);
echo $status; // draft