Hi Rowan,

I have been pondering for a while how to improve the anonymous class
> syntax to allow "capturing" of values from the outer scope, and came up
> with the idea of a special variable marker for "lexically captured
> variable" - instead of $foo, you would write $!foo or $^foo (I quite
> like the "upwardness" of $^).
>

To overcome the issues spotted in the thread, what about doing some sort of
CPP instead of autocapture?

new class (...$arguments) use ($outer) extends Foo {
    public function getIt() {
        return $this->outer;
    }
}

This would be the equivalent of this:

new class ($outer, ...$arguments) extends Foo {
    public function __construct(public mixed $outer, ...$arguments) {
        parent::__construct(...$arguments);
    }
     public function getIt() {
         return $this->outer;
    }
}

And we could also allow this for better type expressivity:
new class (...$arguments) use (private int $outer) extends Foo {
// ...
}

Nicolas

Reply via email to