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

Глава 8. Callables, атрибуты и рефлексия с пределами

Динамика остаётся поддерживаемой, когда область поиска конечна, метаданные проверяются при сборке, а вызов сохраняет типизированный контракт.

После главы вы сможете
  • создавать безопасный registry
  • понимать capture
  • ограничивать reflection

Зачем Pulse реестр обработчиков

Каждый тип события получает обработчик, но switch из пятидесяти ветвей быстро станет общей точкой конфликтов. Реестр связывает каноническое имя с callable, принимающим Event и возвращающим Contribution. Неизвестное имя получает явный результат, а не случайный вызов функции из пользовательской строки.

Callable поступает из доверенной сборки приложения. Никогда не превращайте поле события непосредственно в имя функции или метода: allowlist реестра является границей возможностей.

Сборка реестра

Контролируемая динамикаРефлексия работает при сборке конечного списка, а горячий путь использует готовую карту.ClassesallowlistAttributemetadataReflectionvalidateRegistrytypedDispatchknown key
Рефлексия работает при сборке конечного списка, а горячий путь использует готовую карту.

Closure и захваченные значения

Замыкание по умолчанию захватывает значение через use, а & создаёт разделяемый изменяемый слот. Стрелочная функция автоматически захватывает внешние значения по значению. Захват большого контейнера продлевает его жизнь, поэтому callback worker не должен случайно удерживать весь batch.

First-class callable ClassName::method(...) создаёт Closure с проверяемой ссылкой на метод. Это яснее строковых массивов, но сигнатура всё равно должна соответствовать контракту реестра.

Атрибут — метаданные, не исполнение

Атрибут #[Handles('request.failed')] может назвать тип события. Reflection читает его, проверяет уникальность и создаёт обработчик через контейнер. Конструктор атрибута не должен выполнять сетевую операцию или изменять глобальное состояние.

Ошибку дублированного ключа лучше обнаружить на старте или в CI. Тихое правило «последний победил» делает поведение зависимым от порядка файлов и усложняет расследование.

PHP 8.5 и constant expressions

PHP 8.5 расширил применение статических closures и first-class callables в constant expressions, в том числе для некоторых сценариев атрибутов. Используйте возможность после обновления минимальной платформы и проверки migration guide.

Новая краткость не отменяет читаемость. Если attribute скрывает сложную маршрутизацию, отдельный конфигурационный объект и явный registry проще анализировать и тестировать.

Лаборатория

Создайте три обработчика Pulse и реестр с проверкой дублированного имени. Добавьте неизвестный event type и докажите, что пользовательская строка не может вызвать произвольную функцию.

  • Registry строится из конечного allowlist.
  • Дубликат ломает запуск.
  • Callback не удерживает весь batch.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

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

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

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

1. Можно ли вызывать функцию по имени из недоверенного события?
2. Когда лучше строить reflection registry?

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

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

  • php.nethttps://www.php.net/manual/en/class.closure.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/language.attributes.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

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

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

Аналитика

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

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

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

Политики

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