Одна из фундаментальных особенностей многих языков - перечисления, теперь также являются частью 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;Если эта функция 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 уже есть множество функций, которые делают его подходящим для веб-разработки. По мере того как язык совершенствуется, он продолжает заимствовать от других и внедрять оригинальные особенности.
Добавить комментарий