Перечисляемые типы в PHP
Перечисляемый тип, для краткости enum, - это тип данных используемый для классификации именованных значений. Перечисления могут использоваться вместо жестко закодированных строк для представления, например, статуса сообщения в блоге структурированным и типизированным способом.
У PHP нет собственного типа enum. Он предлагает очень простую реализацию enum, но она, в большинстве случаев, нам не подходит.
Есть такой популярный пакет PHP под названием myclabs/php-enum, который как раз-то и позволяет использовать перечисляемые типы в PHP.
Но сначала, допустим у нас ест вот такой класс:
class Post
{
public function setStatus(PostStatus $status): void
{
$this->status = $status;
}
}
У класса Post есть метод, который устанавливает статус поста. Статус может быть только трех видов:черновик, опубликовано или заархивировано. И больше никакой другой! При использовании строк, ничто нам не гарантирует, что в строке содержится именно то, значение, которое нам необходимо. Поэтому надо найти другое решение и такое решение есть. С помощью библиотеки myclabs/php-enum мы можем сделать следующее:
class PostStatus extends Enum
{
const DRAFT = 'черновик';
const PUBLISHED = 'опубликовано';
const ARCHIVED = 'архивировано';
}
И далее:
class PostStatus extends Enum
{
private const DRAFT = 'черновик';
private const PUBLISHED = 'опубликовано';
private const ARCHIVED = 'архивировано';
}
$post->setStatus(PostStatus::DRAFT());
Внутри библиотеки за основную работу отвечает магический метод __callStatic(), который создает класс PostStatus со значением 'черновик' в нем. Благодоря чему мы можем точно знать, что значение пришедшее в метод является одним из трех заранее предустановленных значений.
Но пример выше не лишен недостатков: так как перечислений в самом PHP нет, то "магия", которая работает за сценой, не дает среде разработки нормально выводить типы, обеспечивать автодополнение. Пример ниже подобных недостатков лишен, да к тому же, в нем меньше кода. А все благодоря документированным комментариям.
/ **
* @method static self DRAFT()
* @method static self PUBLISHED()
* @method static self ARCHIVED()
* /
class PostStatus extends Enum
{
}
Итак, вот таким образом можно использовать перечисляемые типы в Ваших web-приложених для повышения их гибкости.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.