Arrow functions capture by value, and only one expression

A closure needing three variables from the enclosing scope required a use clause listing all three, which is why a one-line callback was four lines.

// before
$filtered = array_filter($rows, function ($row) use ($min, $currency) {
    return $row->total >= $min && $row->currency === $currency;
});

// 7.4
$filtered = array_filter(
    $rows,
    fn($row) => $row->total >= $min && $row->currency === $currency
);

The capture is automatic and by value, so an arrow function cannot modify the outer scope — which removes a whole category of accidental mutation and is the reason there is no by-reference form. The body is one expression, so anything with a statement in it stays a closure; that limit is what keeps the syntax from being used where a named method would read better. They nest, and a nested arrow function captures through both scopes, which is occasionally exactly what a small pipeline wants.