🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
Макросы CalendarDate — расширение API без наследования
Назначение
Регистрация собственных методов дат: CalendarDate::macro('isPayday', fn (CalendarDate $date): bool => ...). Макрос получает дату первым аргументом, объявленные методы класса всегда приоритетнее макросов. Паритет с Carbon::macro().
Для чего и как применять
Доменные предикаты и форматы (рабочий день банка, отчётный период) без подкласса: вызов $date->isPayday() или строго типизированный $date->callMacro('isPayday').
Пример
CalendarDate::macro(
'isPayday',
static fn (CalendarDate $date): bool => $date->format('j') === '25',
);
$date = CalendarDate::parse('2026-09-25', 'UTC');
$date->isPayday(); // true
$date->callMacro('isPayday'); // true, без магии для статанализа
CalendarDate::hasMacro('isPayday'); // true
Анти-паттерны
Реестр макросов глобален для процесса — регистрируйте макросы при бутстрапе и очищайте в тестах через flushMacros(). Неизвестное имя — UnknownMacroException с экранированным именем.
Жизненный цикл
flowchart LR
A[macro(name, closure)] --> R[(MacroRegistry)]
B[date->name(args)] --> C{declared method?}
C -->|yes| D[Class method]
C -->|no| E[__call → callMacro]
E --> R
R -->|found| F[closure(date, ...args)]
R -->|missing| G[/UnknownMacroException/]
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Регистрация методов без наследования | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
Типизированный вызов без магии (callMacro) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Приоритет объявленных методов | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Экранирование имени в исключении | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Очистка реестра для изоляции тестов | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Всего | 🏆 5 | 0 | 3 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano