DEV Community

Mahmoud Ramadan
Mahmoud Ramadan

Posted on

Laravel Collections Bug Caused by Arrow Functions

Freek recently shared a post on X about a bug related to Laravel Collections. The issue was surprising to me because the fix looks almost identical to the original code.

The code that triggered the issue:

collect([])
    ->each(fn (string $hash) => $this->taggedCache($this->tags)->forget($hash));
Enter fullscreen mode Exit fullscreen mode

After the fix:

collect([])
    ->each(function (string $hash) {
        $this->taggedCache($this->tags)->forget($hash);
    });
Enter fullscreen mode Exit fullscreen mode

At first glance, nothing seems to have changed except for replacing the arrow function with an anonymous function. However, that small difference was enough to cause the bug.

Lito highlighted the reason in a comment on the post. The each() method stops iterating when the callback returns false.

With the arrow function:

fn (string $hash) => $this->taggedCache($this->tags)->forget($hash)
Enter fullscreen mode Exit fullscreen mode

The result of forget() is implicitly returned. If forget() returns false, each() interprets that as a signal to stop iterating.

With the anonymous function:

function (string $hash) {
    $this->taggedCache($this->tags)->forget($hash);
}
Enter fullscreen mode Exit fullscreen mode

nothing is returned explicitly, so the callback returns null instead of false. As a result, each() continues iterating without stopping early.

It's a subtle difference, but an important reminder that arrow functions always return the value of their expression, which can sometimes lead to unexpected control-flow behavior in callbacks.

Top comments (0)