Перечисления (перечислимые типы)
Определяйте типобезопасные наборы значений с помощью поддерживаемых и обычных перечислений PHP 8.1
«Перечисления (перечислимые типы)» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Что такое перечисления?
В PHP 8.1 появились перечисления — специальный тип, ограничивающий переменную заранее определённым набором именованных значений и делающий код более выразительным и типобезопасным.
Чистое перечисление (перечисление без значения)
Чистое перечисление содержит именованные варианты без связанного значения. Оно отлично подходит для состояний, направлений или статусов.
<?php
enum Status {
case Active;
case Inactive;
case Banned;
}
$s = Status::Active;
echo $s->name; // "Active"Перечисление с базовым значением
Перечисление с базовым значением связывает с каждым вариантом скалярное значение (целое число или строку), что полезно для хранения в базе данных или передачи в ответах API.
<?php
enum Color: string {
case Red = "red";
case Green = "green";
case Blue = "blue";
}
echo Color::Red->value; // "red"From и TryFrom
Преобразуйте исходное значение обратно в вариант перечисления с помощью from() (вызывает исключение при недопустимом значении) или tryFrom() (возвращает null при недопустимом значении).
<?php
$color = Color::from("red"); // Color::Red
$maybe = Color::tryFrom("purple"); // nullПеречисления в подсказках типов
Используйте перечисления в качестве подсказок типов для параметров и возвращаемых значений — PHP гарантирует, что будут передаваться только допустимые варианты.
<?php
function paint(Color $color): void {
echo "Painting with ".$color->value;
}
paint(Color::Blue); // "Painting with blue"Варианты перечисления в match
Перечисления отлично сочетаются с выражениями match для исчерпывающей обработки.
<?php
$label = match($status) {
Status::Active => "Active user",
Status::Inactive => "Inactive account",
Status::Banned => "Banned",
};
// PHP can warn if cases are unhandledПеречисление реализует интерфейс
Перечисления могут реализовывать интерфейсы, обеспечивая полиморфное поведение.
<?php
interface HasLabel {
public function label(): string;
}
enum Status: string implements HasLabel {
case Active = "active";
case Inactive = "inactive";
public function label(): string {
return ucfirst($this->value);
}
}Методы перечислений
Перечисления могут содержать методы (но не конструктор и не изменяемые свойства).
<?php
enum Suit: string {
case Hearts = "H";
case Diamonds = "D";
case Clubs = "C";
case Spades = "S";
public function color(): string {
return match($this) {
Suit::Hearts, Suit::Diamonds => "red",
Suit::Clubs, Suit::Spades => "black",
};
}
}Константы перечислений
Перечисления могут содержать константы (но не варианты) для связанных скалярных значений.
<?php
enum Direction {
case North;
case South;
const DEFAULT = self::North;
}Перечисление вариантов
EnumName::cases() возвращает массив объектов всех вариантов перечисления — это удобно для создания вариантов выпадающего списка.
<?php
$options = Color::cases();
foreach ($options as $c) {
echo $c->name.": ".$c->value."\n";
}Перечисления и константы классов
Перечисления обеспечивают типобезопасность: нельзя случайно передать целое число 1 там, где ожидается перечисление Status. Константы классов такой гарантии не дают.
Итоги
Перечисления выражают фиксированные наборы значений с типобезопасностью. Используйте чистые перечисления для состояний, а перечисления с базовыми значениями — когда нужны значения для базы данных или API. Для безопасного разбора используйте tryFrom().
Быстрая проверка
Что возвращает Color::tryFrom("недопустимое") при отсутствии совпадающего варианта?
Часто задаваемые вопросы
Урок «Перечисления (перечислимые типы)» бесплатный?
Да — полный текст урока «Перечисления (перечислимые типы)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Перечисления (перечислимые типы)»?
Определяйте типобезопасные наборы значений с помощью поддерживаемых и обычных перечислений PHP 8.1 Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Перечисления (перечислимые типы)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выражение match и именованные аргументы
- Оператор nullsafe и объединённые типы
- Перечисления (перечислимые типы)
- Fibers: кооперативная многозадачность