Re: RFC: Support Closures in constant expressions

From: 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

« previous php.internals (#125878) next »