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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php