Skip to content

Feature Freeze

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

🧊 freeze() — иммутабельность

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

freeze() переводит контейнер в режим «только чтение»: после сборки графа любые изменения определений запрещены.

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

freeze() выставляет флаг frozen. Все мутирующие методы (set, bind, alias, tag, decorate, scoped, включение autowiring и т.д.) вызывают assertMutable() и бросают исключение, если контейнер заморожен. Разрешение сервисов (get / make / call) продолжает работать. isFrozen() сообщает состояние.

$c->set(Db::class, fn () => new Db());
$c->enableAutowiring();
$c->freeze();          // граф собран, дальше — только чтение

$c->isFrozen();        // true
$c->get(Db::class);    // OK
$c->set('x', 1);       // ContainerException: контейнер заморожен

Плюсы

  • Защита от случайных изменений после bootstrap — конфигурация контейнера становится контрактом.
  • Ясная граница между фазой сборки и фазой работы приложения.
  • Помогает в долгоживущих процессах: гарантия, что граф не «поплывёт» в рантайме.

Минусы

  • Нельзя динамически до-регистрировать сервисы после заморозки (это by design).
  • Не влияет на изменяемость самих экземпляров — замораживаются определения, а не состояние объектов.

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

  • Вызывать freeze() в конце bootstrap, перед обработкой запросов/команд.
  • В тестах — проверять, что критичные сервисы зарегистрированы, затем freeze() для fail-safe.

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

  • Полагаться на до-регистрацию сервисов «по требованию» в рантайме вместо явного графа на старте.
  • Ловить исключение заморозки, чтобы «обойти» её и всё-таки изменить контейнер.

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

Контейнер Аналог
PHP-DI нет явного freeze (⚠️ — компиляция даёт похожий эффект)
Symfony compile() у ContainerBuilder — после компиляции контейнер неизменяем
Laravel нет (❌)
Pimple нет (❌)
Nette скомпилированный контейнер неизменяем (✅)

CloudCastle, Symfony, Nette — явная иммутабельность.

См. также: Compiled container · dump().

Clone this wiki locally