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 <nikita....@gmail.com> wrote:

> On Tue, Apr 19, 2016 at 3:31 PM, Joe Watkins <pthre...@pthreads.org>
> 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
>

Reply via email to