Перечисления (PHP 8.1)
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 59 из 91.
До php 8.1 представление фиксированного набора значений, например статусов или типов, означало использование констант класса или магических строк — оба подхода подвержены ошибкам. Перечисления (Enums) предоставляют правильный способ определить тип, который может содержать только определённые, заранее заданные значения.
Определите перечисление с помощью ключевого слова enum:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
Вывод:
ActiveПеречисления также могут иметь backed values — строковые или целочисленные значения, связанные с каждым case. Это полезно при хранении перечислений в базах данных или API:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
Вывод:
activeBacked enum предоставляют метод from() для создания enum из его значения, а tryFrom() возвращает null вместо выбрасывания ошибки для недопустимых значений:
<?php
$status = Status::from('active'); // Возвращает Status::Active
$invalid = Status::tryFrom('unknown'); // Возвращает null
Перечисления также могут содержать методы, что делает их мощным инструментом для инкапсуляции связанной логики. Они без проблем работают с подсказками типов, гарантируя, что ваши функции принимают только допустимые значения — больше не нужно проверять, соответствует ли строка ожидаемым вариантам.
Задание
ЛегкоДавайте создадим систему управления заказами, которая использует перечисления для типобезопасного представления статусов заказов. Вместо строк, в которых можно допустить опечатку или указать недопустимое значение, вы создадите backed enum, сопоставляющий каждый статус со значением, удобным для базы данных.
Вы организуете код в three файлах:
OrderStatus.php: Create строковый backed enum под названиемOrderStatusс four cases:Pendingbacked значением'pending'Processingbacked значением'processing'Shippedbacked значением'shipped'Deliveredbacked значением'delivered'
label(), который возвращает понятное человеку description для each статуса:- Pending возвращает
"Awaiting confirmation" - Processing возвращает
"Being prepared" - Shipped возвращает
"On the way" - Delivered возвращает
"Order complete"
Order.php: Create classOrder, использующий enum. Подключите файл OrderStatus. Class должен:- Accept идентификатор заказа (строка) и
OrderStatusв своём constructor, используя продвижение параметров constructor - Иметь method
getInfo(), который возвращает"Order [id]: [status label]" - Иметь method
getStatusValue(), который возвращает backed value статуса (полезно для хранения в базе данных)
- Accept идентификатор заказа (строка) и
main.php: Подключите файл Order. Вы получите два входных значения: идентификатор заказа и строку статуса (например,"shipped"). ИспользуйтеtryFrom(), чтобы безопасно convert строковый input в enumOrderStatus. Если статус действителен, CreateOrderи выведите две строки:- Результат
getInfo() - Результат
getStatusValue()
"Invalid status".- Результат
Этот challenge демонстрирует, как enum обеспечивают type safety. Ваш class Order может принимать только действительные статусы, а method tryFrom() позволяет безопасно обрабатывать пользовательский input без риска получить invalid values.
Попробуйте сами
<?php
require_once 'Order.php';
// Прочитать ввод
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: Используйте OrderStatus::tryFrom() для безопасного преобразования строки статуса в enum
// tryFrom() возвращает null, если значение недопустимо
// TODO: Если статус валиден, создайте Order и выведите:
// - Результат getInfo()
// - Результат getStatusValue()
// TODO: If the status is invalid, print "Invalid status"
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов10Продвинутые концепции ООП
Композиция и наследованиеВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP