Hi Rowan
Den lør. 27. mar. 2021 kl. 18.05 skrev Rowan Tommins <[email protected]>:
> 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
[email protected]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php