First-class callable syntax (PHP 8.1) створює замикання (Closure) з функції чи методу, записавши (...) замість аргументів.
$length = strlen(...);
$length('привіт'); // 12
$format = $this->formatPrice(...); // метод об'єкта
$create = User::create(...); // статичний метод
array_map(trim(...), $lines);
array_filter($users, $this->isActive(...));
Чим краще за старі способи передати функцію:
array_map('trim', $lines); // рядок
array_filter($users, [$this, 'isActive']); // масив
array_filter($users, fn ($u) => $this->isActive($u)); // обгортка
- Перевіряється одразу: якщо методу не існує чи він недоступний, помилка виникне в момент створення, а не десь пізніше при виклику.
- Рефакторинг і IDE: «перейти до визначення» і перейменування методу працюють - на відміну від імені в рядку
'isActive'. - Видимість:
$this->privateMethod(...)усередині класу створює замикання, яке можна передати назовні й викликати, - а[$this, 'privateMethod']поза класом не спрацює. - Статичний аналіз бачить сигнатуру й перевіряє типи.
Обмеження: не працює з nullsafe ($obj?->method(...) - помилка) і з new Foo(...).
PHP 8.5 доповнив це оператором конвеєра |>, який передає значення в callable праворуч: $text |> trim(...) |> strtoupper(...).