Event как значение
Событие Pulse имеет id, type, occurredAt и payload summary. После создания эти факты не меняются, поэтому readonly-класс подходит как оболочка проверенных значений. Но readonly не гарантирует глубокую неизменяемость объекта, который хранится в свойстве; вложенная mutable-ссылка остаётся изменяемой.
Настоящий инвариант создают проверка конструктора, предметные типы и отсутствие каналов изменения. Модификатор является частью доказательства, а не всей моделью.
Эволюция объекта
Asymmetric visibility
Свойство может быть публично читаемым и более ограниченно записываемым. Это удобно для состояния, которое потребители наблюдают, но меняет только владеющий класс. Решение сравнивается с методом: метод лучше называет предметное действие и способен проверить несколько полей одновременно.
Не раскрывайте public set только ради гидратора. Persistence adapter может использовать конструктор восстановления или отдельную factory, сохраняя модель закрытой для остального приложения.
Property hooks
В PHP 8.4 get и set hooks позволяют вычислять виртуальное свойство или централизовать простое преобразование. Hook не должен прятать запрос к базе, сетевой вызов или неочевидную запись: чтение свойства ожидается дешёвым и повторяемым.
Hooks несовместимы с readonly-свойствами. Перед применением решите, является ли значение хранимым или вычисляемым, и проверьте наследование. Обычный именованный метод часто честнее для операции с заметным эффектом.
Lazy и clone with
Lazy objects PHP 8.4 дают инфраструктуре стандартный механизм отложенной инициализации, но предметный код не должен зависеть от того, materialized ли proxy. Наблюдайте риск N+1 и момент возможного исключения.
PHP 8.5 добавил clone with: новую копию можно создать с изменёнными свойствами. Это удобно для wither-паттерна, однако каждый разрешённый переход всё равно проверяет инварианты. Исполняемые примеры сайта остаются совместимыми с PHP 8.4, поэтому синтаксис 8.5 показан как статический фрагмент после проверки production-runtime.
Лаборатория
Смоделируйте Event и ReportWindow. Объясните, где readonly достаточен, где вложенный объект остаётся mutable и нужен ли property hook. Подготовьте отдельную ветку с clone with для PHP 8.5.
- Hook не выполняет I/O.
- Переход состояния назван предметно.
- Тест доказывает, что исходная версия не изменилась.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/language.oop5.property-hooks.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .