CloudCastle Clock

🇷🇺 Русский · 🇬🇧 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/]

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

Аспект🏆 CloudCastlesymfonycarbonlcobuccibesteergebnis
Регистрация методов без наследования✅❌✅❌❌❌
Типизированный вызов без магии (callMacro)✅❌❌❌❌❌
Приоритет объявленных методов✅❌✅❌❌❌
Экранирование имени в исключении✅❌❌❌❌❌
Очистка реестра для изоляции тестов✅❌✅❌❌❌
Всего🏆 503000

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


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