Абстрактный класс Enum
позволяет создавать enum-объекты (см. перечисляемый тип).
- Поддержка дополнительных данных для значений.
- Поддержка геттеров.
- Поддержка фильтрации.
- Вспомогательные функции (
toIds
,toList
,toArray
,toObjects
,isValid
).
Рекомендуется установка через composer:
composer require vjik/php-enum
use vjik\enum\Enum;
class Status extends Enum
{
const DRAFT = 'draft';
const PUBLISH = 'publish';
}
Массив с данными задаётся в статической функции items()
.
use vjik\enum\Enum;
class Status extends Enum
{
const DRAFT = 'draft';
const PUBLISH = 'publish';
public static function items()
{
return [
self::DRAFT => 'Черновик',
self::PUBLISH => 'Опубликован',
];
}
}
Для всех дополнительных данных необходимо прописать свойства 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);
Второй вариант препочтительнее, так как он кэширует объекты и, если объект уже был инициализирован, то он будет взят из кэша, а не будет создан заново.
Возвращает массив значений объекта. Поддерживает фильтрацию.
Status::toIds(); // ['draft', 'publish']
Status::toIds(['priority' => 20]); // ['publish']
Возвращает массив вида $id => $name
. Поддерживает фильтрацию.
Status::toList(); // ['draft' => 'Черновик', 'publish' => 'Опубликован']
Status::toList(['priority' => 20]); // ['publish' => 'Опубликован']
Возвращает массив вида:
[
$id => [
'id' => $id,
'name' => $name,
'param1' => $param1,
'param2' => $param2,
…
],
…
]
Поддерживает фильтрацию.
Status::toArray();
Status::toArray(['priority' => 20]); // ['publish' => 'Опубликован']
Возвращает массив вида:
[
$id => Enum,
…
]
Проверяет, существует ли значение в перечисляемом типе. Поддерживает фильтрацию.
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;
}
Проверяет, что значение соответствует одному из значений, указанных в массиве $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