Skip to content

Feature LazyGhost

github-actions[bot] edited this page Jul 8, 2026 · 1 revision

👻 Lazy ghost proxy

← Возможности · Главная · Сравнение

lazyGhost($type, $serviceId) создаёт прозрачный прокси, реализующий интерфейс сервиса: реализация не загружается, пока не вызовут её метод. Symfony-style ghost.

Принцип работы

LazyGhostProxyFactory (через symfony/var-exporter, opt-in) генерирует объект того же типа, что и сервис, но «пустой». Любой вызов метода прокси материализует реальный сервис (get($serviceId)) и делегирует. Для потребителя прокси неотличим от настоящего сервиса — в отличие от lazy(), не нужно звать ->get().

composer require symfony/var-exporter   // opt-in, не runtime-зависимость контейнера

$c->set('reports', fn () => new ReportGenerator());
$c->set('contract', fn (Container $c) =>
    $c->lazyGhost(ReportGeneratorInterface::class, 'reports')
);

$contract = $c->get('contract');   // ghost, ReportGenerator ещё НЕ создан
$contract->generate();             // здесь материализуется и вызывается

Плюсы

  • Прозрачность: прокси — того же типа, код-потребитель не знает о ленивости.
  • Реальный объект не создаётся до первого вызова метода (экономия на дорогих сервисах).
  • Помогает разрывать циклы без изменения сигнатур.

Минусы

  • Требует symfony/var-exporter (opt-in зависимость; без неё бросается понятное исключение).
  • Прокси-объект имеет накладные расходы на генерацию/материализацию.
  • Не для final-классов без интерфейса (нужен тип, который можно проксировать).

✅ Рекомендуется

  • Использовать, когда нужна типовая прозрачность (сервис объявлен по интерфейсу и внедряется как есть).
  • Для дорогих сервисов на «холодных» ветках выполнения.

❌ Антипаттерны

  • Проксировать дешёвые сервисы — накладные расходы прокси превысят выгоду.
  • Полагаться на ghost там, где достаточно лёгкой обёртки lazy().

Аналоги в других контейнерах

Контейнер Аналог
PHP-DI lazy через ocramius/proxy-manager (⚠️ внешняя зависимость)
Symfony lazy: true — ghost/virtual proxy (эталон)
Laravel нет нативного ghost (❌)
Pimple нет (❌)
Nette ленивость ядра, без ghost-прокси того же типа

CloudCastle, Symfony — ghost-прокси того же типа.

См. также: Lazy service · Детекция циклов.

Clone this wiki locally