Как использовать перечисления в PHP 8

Категория: веб разработка

Одна из фундаментальных особенностей многих языков - перечисления, теперь также являются частью PHP. Перечисления (enums) - это тип данных, который вы можете использовать для хранения значения из пользовательского набора. Они идеально подходят для представления тех видов опций, которые вы могли бы показать в раскрывающемся списке.

PHP 8.1 ввел поддержку перечислений. Эти перечисления легко использовать, но они предлагают дополнительные функции, заимствованные из объектно-ориентированного программирования.

Что делают перечисления

Перечисления полезны, когда вы хотите работать с фиксированным набором связанных значений. Например, вы можете использовать перечисление для представления мастей в колоде карт или типов транспортных средств.

Перечисления в PHP довольно сложны, с определенными особенностями, заимствованными из классов. Вы можете использовать их в сочетании с подсказками типа, чтобы написать более надежный, предсказуемый код.

Основы перечислений

Перечисления обычно хранят скалярные значения. Они аналогичны примитивным типам данных в C, хотя перечисления PHP могут хранить и строки, а не только целые числа. Тем не менее, по умолчанию перечисленные значения PHP не имеют скалярного эквивалента. Их называют базовыми перечислениями:

enum Season
{
case Spring;
case Summer;
case Autumn;
case Winter;
}

Обратите внимание, как PHP повторно использует ключевое слово case, которое вы также встретите в операторах switch. Значения, которые представляет это перечисление, просто являются именами случаев. Вы можете обратиться к конкретному значению перечисления, используя этот синтаксис:

EnumTypeName::EnumField

Например, чтобы обратиться к зиме, используйте:

Season::Winter

Вы можете присвоить это значение переменной и проверить его на равенство с другими значениями Season:

$favorite = Season::Summer;

if ($favorite == get_current_season()) {
echo "Это мое любимое время года!";
}

С использованием подсказок типа, вы можете ограничить параметры или типы возвращаемых значений конкретным перечислением. Это помогает избежать целого ряда ошибок и общим образом делает ваш код более поддерживаемым:

function get_current_season(): Season
{
$day = date("z");
if ($day < 59 || $day > 333) return Season::Winter;
if ($day < 151) return Season::Spring;
if ($day < 243) return Season::Summer;
if ($day < 334) return Season::Autumn;
}

Если эта функция get_current_season попытается вернуть что-то, отличное от Season, PHP вызовет фатальную ошибку типа.

Поддерживаемые перечисления

PHP использует термин "поддерживаемое перечисление" для обозначения перечисления с значениями. Эти значения могут быть целыми числами или строками:

enum Month: int
{
case Jan = 1;
case Feb = 2;
//...
}

Вы должны объявить тип поддерживаемого перечисления, и он должен быть либо int, либо string.

Вы можете получить доступ к базовому значению, используя свойство только для чтения value:

echo Month::Jan->value;

Когда вы используете поддерживаемые перечисления, вы также можете преобразовывать их из их эквивалентного скалярного значения с использованием метода from:

var_dump(Month::from(2));

Методы перечислений

Перечисления PHP также могут иметь методы, делая их немного похожими на урезанный класс. Это отражает позицию PHP где-то между процедурным и объектно-ориентированным языком.

Например, вы можете добавить этот простой метод к перечислению Month для получения количества дней от определенного значения:

/* Заметка: нет обработки високосных годов! */
function daysInMonth(): int {
if ($this == Month::Feb) return 28;
if (in_array($this, array(Month::Apr, Month::Jun, Month::Sep, Month::Nov))) return 30;
return 31;
}

Обратите внимание, что вы можете использовать $this, чтобы обратиться к конкретному значению перечисления, так же, как вы используете $this для обращения к конкретному объекту. Вы также можете использовать стандартный оператор сравнения, ==, для сравнения значений перечисления.

Перечисления также поддерживают статические методы. Вероятно, у вас не будет много применения для них, но они могут быть полезны, если вам нужно написать что-то, что работает как конструктор, например:

static function random(): Month {
return Month::from(rand(1, count(Month::cases())));
}

Лучше перечислить, чем никогда

Перечисления - это общая особенность многих языков, включая предка PHP, C. Они являются одной из основных особенностей версии 8.1, принося язык на уровень со многими его конкурентами.

У PHP уже есть множество функций, которые делают его подходящим для веб-разработки. По мере того как язык совершенствуется, он продолжает заимствовать от других и внедрять оригинальные особенности.





Если вам нужен по настоящему хороший и профессиональный веб хостинг или свой высокопроизводительный сервер, то смело переходите по ссылке и заказывайте!

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *



Карта сайта
Copyright © 2023