Re: RFC: Support Closures in constant expressions
| From: | Michał Marcin Brzuchalski | Date: | Wed, 30 Oct 2024 09:58:59 +0000 |
| Subject: | Re: RFC: Support Closures in constant expressions | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125878@lists.php.net to get a copy of this message | ||
Hi Tim
śr., 30 paź 2024 o 09:02 Tim Düsterhus <tim@bastelstu.be> napisał(a):
> Hi
>
> Am 2024-10-30 05:25, schrieb Larry Garfield:
> > This seems like a good idea to me. My only real question is why we
> > need to forbid short-closures. I fully agree that capturing variables
> > for such functions doesn't work. What I don't understand is why that
> > precludes short-closures. Is it not possible to "just" say "there's
> > nothing to even capture in this context, don't try"? (There may be
> > technical reasons for that, but I do not know what they are and the RFC
> > doesn't say.)
>
> It would indeed require some special handling to disable the
> auto-capturing in the code. This would be solvable of course, but
> there's also semantic ambiguity, because users reasonably expect short
> closures to perform auto-capturing:
>
> <?php
>
> $foo = 'foo';
>
> const Closure = static fn (array $bar): array => [$foo, $bar];
>
Personally, I'd expect short-closures be available as well, did you though
about maybe reusing
const token instead of static to make the
information visually available for users?
I mean if PHP could parse `const Closure = const fn (array $bar): array =>
[$foo, $bar]; and the documentation tells that const` modifier prevent
auto-capture in case of short-closures but also in case of normal closures
to prevent use of use() clause that would be visible instantly in the code.
Consider this syntax as well:
<?php
$foo = '';
const Closure = const function (array $bar): array { return [$foo, $bar]; }
This way we could also forbid use of global-variables, use() clause and
maybe even static $baz = 1 inside functions. So the closures better match
constant semantics. WDYT?
The engine could create an instance of let's say \ConstClosure that would
be a subtype of \Closure so it still can be used as a normal closure but
not the other way. Effectively this would make these closures
pure-functions if am not wrong here.
Overall I like the idea.
Cheers,
Michał Marcin Brzuchalski