🇷🇺 Русский · 🇬🇧 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)
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Скоуп-подмена с автовосстановлением | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Восстановление при исключении | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Дефолт без установки — системные часы | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
Явные isSet()/reset() | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Всего | 🏆 4 | 1 | 3 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano