Can we just halt this conversation for a few days. That implementation is totally and utterly wrong, it's so obvious this morning ... I'm almost embarrassed.
I must say that of all the suggestions made so far for syntax, I still prefer use(). While the idea to allow symbols and expressions is very cool, it will create so much confusion that an anonymous class can do things like set objects as member properties but other classes can't. The syntax also looks absolutely terrible when it comes to refs: class { public $thing = &$this->thing; } This is almost literally *backwards*. All of the solutions suggested so far also create rather a lot of repetition for anything that isn't example code. Anyway, the implementation is broken, let's come back to this discussion later on, please. Cheers Joe On Wed, Apr 20, 2016 at 4:54 AM, Jesse Schalken <m...@jesseschalken.com> wrote: > 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 >> > >