Re: 5.4's New De-referencing plus assignment
| From: | Nikita Popov | Date: | Wed, 30 Nov 2011 19:13:21 +0000 |
| Subject: | Re: 5.4's New De-referencing plus assignment | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-56689@lists.php.net to get a copy of this message | ||
To me the main problem here is that $bar = ($foo = new Foo)->bar()
simply doesn't make much sense. It is equivalent to:
$foo = new Foo;
$bar = $foo->bar();
Which is much cleaner and easier to understand.
The plain (new Foo)->bar() syntax *is* useful for cases like (new
ReflectionClass($class))->implementsInterface('Foo'), where you need
only one single bit of information from a class.
Nikita
On Wed, Nov 30, 2011 at 8:02 PM, Ralph Schindler
<ralph@ralphschindler.com> wrote:
> Nikita,
>
> You're completely right about the expanded expressions, but I'm not sure its
> an edge-case per-se.
>
> The problem with the current syntax is that the resultant of the 'new'
> operation is lost UNLESS your chained method returns $this - which IMO makes
> it about as 1/2 as useful as it really could be.
>
> In the case of "new" though, the resultant is always an object, it seems
> like it should be permissible to change the parser to allow for variable
> assignment of the target object.
>
> I think for people just trying out this new behavior (by seeing it in the
> release notes as (new Foo)->bar()), the next logical thing is to try this
> syntax:
>
> ($foo = new Foo)->bar()
>
> // OR in bison
> '(' variable '=' new_expr ')'
>
> I did it, and I see other people doing it too. So I guess the question is....
> "how edge case is this edge case?" :)