Обидві створюють об'єкт Closure, але по-різному працюють із зовнішніми змінними.
Анонімна функція (function () use (...)) бачить лише ті зовнішні змінні, які явно перелічені в use, і захоплює їх за значенням у момент створення:
$rate = 1.2;
$withTax = function (int $price) use ($rate): float {
return $price * $rate;
};
Щоб змінювати зовнішню змінну, - захоплення за посиланням: use (&$total).
Стрілкова функція (fn, PHP 7.4) автоматично захоплює всі зовнішні змінні, які використовує, за значенням:
$withTax = fn (int $price): float => $price * $rate;
Відмінності:
- Лише один вираз. Тіло стрілкової функції - один вираз, результат якого повертається. Кілька інструкцій - тільки анонімна функція.
- Не можна змінити зовнішню змінну.
fn () => $count++змінить копію, а не$countззовні. Для накопичення - анонімна функція зuse (&$count). useне потрібен - менше шуму в коді.
Де що використовують:
fn- короткі колбеки:array_map(fn ($u) => $u->email, $users),->filter(fn ($o) => $o->isPaid()),->when($search, fn ($q) => $q->where(...)).function- колбеки з кількома кроками, розгалуженнями чи зміною зовнішнього стану.
Обидві автоматично прив'язують $this усередині класу. Щоб уникнути цього (і зайвого утримання об'єкта в пам'яті), - static fn чи static function.