-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature LazyGhost
github-actions[bot] edited this page Jul 8, 2026
·
1 revision
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 · Детекция циклов.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton