I'm not sure it matters, but there is some precedent for this in
JavaScript/ES6:
function foo(bar) {
return new class {
myBar = bar;
getBar() {
return this.myBar;
}
}();
}
console.log(foo('hello').getBar()); // "hello"
(You can actually reference outer symbols anywhere in the definition of a
JS class, so I could have used "bar" directly in "getBar" without going
through a property.)
On Wed, Apr 20, 2016 at 12:18 AM, Nikita Popov <[email protected]> wrote:
> On Tue, Apr 19, 2016 at 3:31 PM, Joe Watkins <[email protected]>
> wrote:
>
> > Morning Internals,
> >
> > Please review the following RFC:
> >
> > https://wiki.php.net/rfc/lexical-anon
> >
> > A look at the patch from those of you that do that would be good :)
> >
>
> Hey Joe,
>
> The syntax and semantics proposed in this RFC don't sit quite well with me.
> Especially the fact that a use($foo) on the class is then used as
> $this->foo in methods is non-intuitive to me, as it differs from how the
> same syntax behaves on closures. I'd like to suggest an alternative syntax:
>
> $foo = 42;
> return new class {
> private $bar = $foo;
> public function getBar() { return $this->bar; }
> }
>
> That is, allow properties inside the anonymous class to be initialized
> based on values from the surrounding scope. This is more explicit (clearly
> shows that a property is being created), it allows explicit control over
> the visibility and, depending on implementation, might be more flexible
> with regards to the values it accepts. It probably doesn't make sense to
> restrict this to specific expressions, so all of
>
> return new class {
> private $a = $var;
> private $b = $obj->prop;
> private $d = $obj->prop ?? 'default';
> // ...
> }
>
> could be fine.
>
> Thanks,
> Nikita
>