Re: Brainstorming idea: inline syntax for lexical (captured) variables
| From: | Larry Garfield | Date: | Thu, 16 Mar 2023 22:14:40 +0000 |
| Subject: | Re: Brainstorming idea: inline syntax for lexical (captured) variables | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-119730@lists.php.net to get a copy of this message | ||
On Thu, Mar 16, 2023, at 5:06 PM, Rowan Tommins wrote:
> On 16/03/2023 17:59, Nicolas Grekas wrote:
>> We could define the "use" as declaring + setting the properties before
>> the constructor is called, if any.
>> But I'm also fine making both constructs conflict: when there is a
>> constructor, the boilerplate saved by the "use" becomes really low.
>> No strong opinion either. There could be other factors to consider.
>
>
> The main advantage of generating an actual constructor is that no change
> is needed to the shared object initialization code, which could be
> complex and even have performance impact. The only new logic would be in
> compiling the class entry and putting the arguments into the "new
> class(...)" statement.
>
> The more I think about it, the more I'm leaning to just blocking custom
> constructors, and saying you can either have the use() short-hand, or
> you can have custom initialization. Additional functionality can always
> be added in later if someone comes up with a clean implementation and a
> good use case.
Wouldn't the functionality described boil down to essentially just materializing into a few
extra lines in the constructor? At least to my ignorant non-engine brain it seems straightforward
to have this:
$a = 1;
$b = 2;
$c = 3;
$o = new class ($a, $b) use ($c) {
public function __construct(private int $a, private int $b) {}
public function something() {}
}
Desugar to this:
$c = class ($a, $b) use ($c) {
private $c;
public function __construct(private int $a, private int $b) {
$this->c = 3; // By value only, so this should be fine?
}
public function something() {}
}
--Larry Garfield