On Tue, Feb 26, 2013 at 7:41 AM, Dmitry Stogov <dmi...@zend.com> wrote:
> Hi Nikita, > > I like the idea. > But note, that it may cause some unexpected behaviour and bugs. > I didn't test the patch I just guess it on my previous experience > introducing similar features. > > - usage expression in write context (e.g. passing constant by reference) > > function foo(&$foo) {} > foo("abc"[0]); > > - destruction of temporary result > > ($a . $b)[4]; // if ($a.$b) is destroyed? > > - in some cases destruction of temporary result may cause destruction of > final result > > ((object)(array("a"=>"b")))->a = "c"; // temporary object may be destroyed > before assignment > > All these edge cases must be carefully analyzed. > I like the current patch, and in case the edge cases won't require many > hacks, I'm all for it. > > Thanks. Dmitry. > All these edge-cases are covered by not being allowed :) The old (new Foo)->bar syntax did not allow usage as a variable and I stayed with that. I.e. (expr)->xyz will still be an expression, not a variable and as such (expr)->xyz = 'foo' will be a syntax error. I stayed with the old behavior because I thought that it would just be a small bugfix-like change that way, whereas allowing usage in write-context could require larger changes (though I haven't tried, maybe its just as simple). But now that everybody seems to think that this is a major change that requires serious consideration, I guess I can have a look at the write-context use too :) Nikita