Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 10 из 20III. Управляемая динамика130 минут

Глава 10. Современные объекты PHP 8.4–8.5

Современная возможность оправдана, когда делает инвариант или границу изменения яснее; краткий синтаксис без правила не улучшает модель.

После главы вы сможете
  • выбирать property hook осознанно
  • различать readonly и immutable
  • планировать clone with

Event как значение

Событие Pulse имеет id, type, occurredAt и payload summary. После создания эти факты не меняются, поэтому readonly-класс подходит как оболочка проверенных значений. Но readonly не гарантирует глубокую неизменяемость объекта, который хранится в свойстве; вложенная mutable-ссылка остаётся изменяемой.

Настоящий инвариант создают проверка конструктора, предметные типы и отсутствие каналов изменения. Модификатор является частью доказательства, а не всей моделью.

Эволюция объекта

Из сырого события в устойчивое значениеИзменение создаёт новую проверенную версию, а исходный объект сохраняет прежнее состояние.RawarrayFactoryvalidateValue objectreadonlyWith changenew copyPersistsnapshot
Изменение создаёт новую проверенную версию, а исходный объект сохраняет прежнее состояние.

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 этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Гарантирует ли readonly глубокую неизменяемость вложенного объекта?
2. Что не следует помещать в property get hook?

Перелинковка со справочником

Проверка актуальности

  • 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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie