Skip to content

Feature Callback clock

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

🔄 Часы на callback — CallbackClock

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

Каждый вызов now() делегируется замыканию. Максимальная гибкость для сценариев, не покрытых готовыми реализациями.

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

use CloudCastle\Clock\CallbackClock;

// Последовательность моментов: каждый вызов now() — следующая секунда.
$tick = 0;
$clock = new CallbackClock(static function () use (&$tick): DateTimeImmutable {
    ++$tick;

    return new DateTimeImmutable(sprintf('2026-01-01 00:00:%02d', $tick), new DateTimeZone('UTC'));
});

$clock->now()->format('s'); // 01
$clock->now()->format('s'); // 02

Таймзона декларируется отдельным аргументом (строкой или объектом); withTimezone() сохраняет callback вместе с его состоянием.

Плюсы

  • Произвольные источники времени: внешние сервисы, записанные последовательности, генераторы сценариев.
  • Состояние замыкания сохраняется при смене зоны.

Минусы

  • Ответственность за корректность моментов — на callback-е: пакет не может валидировать то, что вернёт ваше замыкание.

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

  • Тесты, где нужен нетривиальный сценарий времени (скачки, повторы, deterministic-последовательности).
  • Мост к внешнему источнику времени (например, времени брокера сообщений).

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

  • Тяжёлая логика в callback-е на горячем пути — now() зовётся часто.

Схема фичи

flowchart LR
    CL["closure(): DateTimeImmutable"] --> CC[CallbackClock]
    CC -->|"каждый now() → вызов замыкания"| OUT[Момент из вашего источника]
Loading

Жизненный цикл последовательности

sequenceDiagram
    participant T as Тест
    participant C as CallbackClock
    participant F as Замыкание (счётчик)

    T->>C: now()
    C->>F: вызов
    F-->>C: 00:00:01
    T->>C: now()
    C->>F: вызов
    F-->>C: 00:00:02
Loading

Сравнение с аналогами

Возможность Clock symfony/clock lcobucci/clock beste/clock nesbot/carbon ergebnis/clock 🏆 Победитель
Часы на замыкании Clock
Декларируемая таймзона Clock

Clone this wiki locally