Skip to content

Feature Lazy

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

⏳ Ленивые значения

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

Сервисы и дорогие значения вычисляются при первом обращении — семантика Pimple (shared/factory/protect) внутри реестра данных.

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

  • defer($key, $closure) — фабрика выполнится один раз при первом get(), результат материализуется в реестре (shared).
  • factory($key, $closure)новое значение на каждый get(); результат не удерживается реестром (память не растёт).
  • protect($key, $closure) — замыкание сохраняется как значение и возвращается без вызова.
  • has() видит отложенные и фабричные ключи; all() отдаёт только материализованные значения; keys()/count() учитывают всё.
  • Исключение из фабрики не «портит» реестр: значение не запоминается, повторный get() повторит попытку.
use CloudCastle\Registry\Registry;

$services = new Registry();

$services->defer('db', static fn (): PDO => new PDO($dsn)); // соединение — лениво
$services->factory('запрос', static fn (): Request => Request::capture());
$services->protect('обработчик', static fn (int $x): int => $x * 2);

$services->get('db');          // PDO создан здесь, второй get — тот же объект
$services->get('запрос');      // каждый раз новый Request
$services->get('обработчик');  // само замыкание, без вызова

Производительность

Повторный доступ к shared-сервису — обычный hash-lookup материализованного значения: ~11.7M ops/s против 6.3M у Pimple и 2.9M у illuminate/container.

См. также

Clone this wiki locally