В 8.5 приняты два RFC:
▸ PHP RFC: Support Closures in constant expressions,
▸ PHP RFC: First Class Callables in constant expressions.
Они позволяют использовать анонимные функции и first class callable синтаксис в константных выражениях (значениях параметров по умолчанию, константах, константах класса и атрибутах).
Как всегда в PHP нельзя что-то добавить без "но". В данном случае исключение сделано для стрелочных функций, потому что они автоматически захватывают контекст, а константные выражения не могут содержать переменные.
final class Request
{
#[Validate(is_string(...))]
#[Validate(static function (string $locale): bool {
return preg_match('/^[a-z]{2}$/', $locale);
})]
public mixed $locale = 'ru';
}
final readonly class Checks
{
public const Closure IS_STRING = is_string(...);
public const Closure IS_LOCALE = static function (string $locale): bool {
return preg_match('/^[a-z]{2}$/', $locale);
};
}
final readonly class Worker
{
public function __construct(
private Closure $onFinish = static function (): void {}
) {}
// ...
}