Re: RFC: Anonymous Class Lexical Scope
| From: | Joe Watkins | Date: | Wed, 20 Apr 2016 06:36:43 +0000 |
| Subject: | Re: RFC: Anonymous Class Lexical Scope | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-92522@lists.php.net to get a copy of this message | ||
Oh, I fixed it ... I think ... carry on ...
Cheers
Joe
On Wed, Apr 20, 2016 at 7:01 AM, Joe Watkins <pthreads@pthreads.org> wrote:
> 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 <me@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.ppv@gmail.com>
>> wrote:
>>
>>> On Tue, Apr 19, 2016 at 3:31 PM, Joe Watkins <pthreads@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
>>>
>>
>>
>