-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Callback clock
github-actions[bot] edited this page Jul 14, 2026
·
1 revision
Каждый вызов 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[Момент из вашего источника]
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
| Возможность | Clock | symfony/clock | lcobucci/clock | beste/clock | nesbot/carbon | ergebnis/clock | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Часы на замыкании | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Clock |
| Декларируемая таймзона | ✅ | — | — | — | — | — | Clock |
CloudCastle Clock · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)