CloudCastle Clock

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano

ClockHolder — глобальные часы со скоуп-подменой

Назначение

Глобальный слот часов приложения: set()/get()/reset() и within($clock, $fn) — временная подмена с гарантированным восстановлением даже при исключении.

Для чего и как применять

Мост для кода без DI и для DatePoint; в тестах within() изолирует подмену от соседних тестов.

Пример

$result = ClockHolder::within(
    MockClock::from('2026-01-01 00:00:00', 'UTC'),
    fn () => $service->generateReport(),   // внутри «сейчас» = 2026-01-01
);
// глобальные часы восстановлены автоматически

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

Глобальное состояние — осознанный компромисс: в новых сервисах внедряйте ClockInterface напрямую.

Жизненный цикл

sequenceDiagram
    participant T as Caller
    participant H as ClockHolder
    T->>H: within(mock, fn)
    H->>H: save previous, set mock
    H->>T: fn() result
    H->>H: restore previous (finally)

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

Аспект🏆 CloudCastlesymfonycarbonlcobuccibesteergebnis
Скоуп-подмена с автовосстановлением✅❌✅❌❌❌
Восстановление при исключении✅❌✅❌❌❌
Дефолт без установки — системные часы✅✅✅❌❌❌
Явные isSet()/reset()✅❌❌❌❌❌
Всего🏆 413000

← К списку возможностей


🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano