Skip to content

vjik/php-enum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 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,
            ]
        ];
    }
}

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

Создать объект можно через создание класса или статическую функцию get:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[
    $id => Enum,
    …
]

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

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

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

Фильтрация

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

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

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

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

В качестве оператора можно использовать статическую функцию объекта. В функцию будут переданые все элементы массива за исключением оператора. Например:

// Фильтр
[['numberMore', 102]]

// Функция в объекте
public static function numberMore($item, $v)
{
    return $item['number'] > $v;
}

Оператор in

Проверяет, что значение соответствует одному из значений, указанных в массиве $value. Например:

[
   Status::isValid('publish', [['in', 'priority', [5, 10]]]); 
   Status::isValid('closed', [['in', 'id', ['publish', 'closed', 'draft']]]); 
]

Геттеры

Геттер — это метод, чьё название начинается со слова 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