Объект отвечает за инвариант
Duration принимает секунды и не позволяет отрицательное значение. ExerciseName гарантирует допустимую длину нормализованного текста. После создания остальной код больше не повторяет одни и те же проверки в контроллере, сервисе и repository.
Не оборачивайте каждую строку автоматически. Если значение не имеет поведения, повторного правила или риска перепутать единицы, простой тип в локальном контексте может быть яснее.
Переход от сырого ввода
Readonly — обещание ссылки
readonly-свойство нельзя переназначить после инициализации, но объект, на который оно ссылается, способен иметь собственное изменяемое состояние. Иммутабельность всей модели достигается дизайном, а не одним ключевым словом.
Для обновления immutable-значения создаётся новый экземпляр. PHP 8.5 добавляет clone with, упрощая wither-паттерн для readonly-классов. Фрагмент остаётся необязательным, если проект поддерживает PHP 8.4.
Clone with в PHP 8.5
<?php
readonly class SetTarget
{
public function __construct(
public int $repetitions,
public int $weightGrams,
) {}
public function withWeight(int $grams): self
{
return clone($this, ['weightGrams' => $grams]);
}
}Enum моделирует закрытый набор
Статус Draft, Published и Archived лучше строк с опечатками и неизвестными значениями. Методы enum могут описывать допустимые переходы, но не должны превращать тип в сервис, который сам пишет в базу или читает текущего пользователя.
Миграция enum требует совместимости между кодом и хранилищем. Сначала база принимает новое значение, затем публикуется код, и только после завершения перехода удаляется старое. Закрытый набор в PHP не отменяет ограничение в базе.
Лабораторная работа
Создайте Duration, Weight и WorkoutStatus. Запретите отрицательные значения, опишите допустимые переходы статуса и покажите обновление immutable-цели без изменения исходного объекта.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .