Hi Rowan

Den lør. 27. mar. 2021 kl. 18.05 skrev Rowan Tommins <rowan.coll...@gmail.com>:
> Based on those, there seems to be no way to prevent a variable being
> captured, even if its value is immediately discarded each time the
> closure runs. This may be less than ideal:
>
> $results = getLargeReportFromDatabase();
> // ...
> $fn = fn() {
>      $results = []; // coincidentally the same name, immediately
> assigned its own value
>      // ...
> }
> unset($results); // does not free the array, because $fn has captured
> the value

I too am very concerned about this exact senario because it very
easily overlooked. While I understand the appeal of having very short
closures, I do think that such behavior needs to be explicit and would
much rather prefer something like this:

 - Make the `fn` keyword an alias of the `function` keyword
 - Add a new `auto` (or similar)  keyword for explicit auto capture

Something like this:
```php
return function () use ($v1, $v2, $v3, $v4) {
    /* ... */
};
```

Would then be abled to be turned into:
```php
return auto fn () {
    /* ... */
};
```

That way it is very clear that the closure is intending on auto
capturing at this point, at the same time it also allows people like
me who prefers the `function` keyword to write.

I personally don't think adding those 5 extra characters here for
explicitity is bad, I would like explicitly over implicitit, I can see
how many would simply just write `fn` without knowing there is a very
vitual difference (similar to `static` closures is rare if you don't
intend on binding `$this`).

-- 
regards,

Kalle Sommer Nielsen
ka...@php.net

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to