On 14 April 2023 05:35:39 BST, "Michał Marcin Brzuchalski" 
<michal.brzuchal...@gmail.com> wrote:

>Have you thought about not populating property by default but instead:
>* adding "use" language construct as default to all methods?
>* adding ability to assign variable values from "use" to property if needed?
>
>Like desugar to
>$c = class ($a, $b) use ($c) {
>    private $c = $c; // optional, not required, no conflicts
>    public function __construct(private int $a, private int $b) use ($c) {
>        $this->c = $c % 2 ? 3 : 5;
>    }
>    public function something() use ($c) {
>        return $c;
>    }
>}


This is closer to what I originally proposed, but with different syntax.

The challenge, as was pointed out to me, is that the anonymous class is 
compiled as a reusable class definition on first use, and a new instance 
construction on each execution, so you have to think about what happens at each 
stage.

In this example, you've got to first compile something where $c is an open 
parameter of some sort, and make it available to all the contexts where it 
might be used; then, when you create the instance, supply a value for $c, and 
attach it to the instance somewhere; and finally, when something() is called, 
look up that attached value and make it available to the method.

In other words, the use() clause on the class ends up acting like a constructor 
parameter, and the references in methods end up acting like property 
references. It's a lot of extra complication to duplicate things the language 
already has.

Having played with it a bit while implementing, I also like the conciseness of 
objects with no explicit body at all:

$who = new class use ($firstName as string, $lastName as string) {};
echo $who->firstName;

Regards,

-- 
Rowan Tommins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to