I am not sure I like the idea of explicit $this.
Frankly, I really doubt we will have serious resource issues as a result of 
holding a reference to $this for too long. I think we're looking to solve a 
non-issue.

I'd prefer to take the approach which is easier to use and cleaner from a user 
perspective. If we ever discover this is a huge issue then we can always add 
support for something like "static function() {}" which does not hold a $this 
reference.

Andi

> -----Original Message-----
> From: Dmitry Stogov
> Sent: Friday, June 27, 2008 10:02 AM
> To: Christian Seiler
> Cc: php-dev List; Andi Gutmans; Stas Malyshev
> Subject: Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
> 
> Hi Christian,
> 
> I reworked your patch a little bit.
> 
> 1) Fixed ref/noref issues
> 
> 2) Explicit $this passing
> 
> $a = function foo() use ($this) {}
> 
> 3) Some code reorganization to encapsulate closure implementation.
> 
> Thanks. Dmitry.
> 
> Christian Seiler wrote:
> > Hi Dmitry,
> >
> >> I'm fine if you'll improve my patch (It's mainly yours :)
> >
> > I updated my closures RFC: http://wiki.php.net/rfc/closures
> >
> > I have based my new version of the patch on yours (Dmitry), but I made
> > some changes to that:
> >
> >  * Objects instead of resources are used, two new files
> >    zend_closures.[ch] are added where the new Closure class
> >    is defined. Currently, it contains a dummy __toString method
> >    that in future may be extended to provide enhanced debugging info,
> >    also further additional cool stuff could be added to such a
> >    class later on. But I prefer to only add the basic closure
> >    functionality at first - you can always extend it once it's there.
> >
> >  * I have *not* added any __invoke() magic to normal objects. This is
> >    mainly due to the simple reason that adding that would not help
> >    a closure implementation at all. Closures need some engine internal
> >    magic (use a dynamically created op_array instead of looking one up,
> >    setting the correct class scope and setting the correct EG(this). And
> >    as I said: I want to stick with the closure basics for now.
> >
> >    That said, I do like the possibility of invoking objects directly, so
> >    I suggest someone created an additional proposal for that?
> >
> >  * I've added a patch for PHP HEAD (PHP 6.0). This is due to the fact
> >    that Dmitry's variant of my patch has far less intersections with
> >    the unicode functionality than my original patch, so it was quite
> >    straight-forward to do so.
> >
> >  * Lexical vars are now copied instead of referenced by default. Using
> >    & in front of the var, the behaviour may be changed. I added that in
> >    order to demonstrate that both was possible and that a simply change
> >    of grammar suffices. In my eyes this is the main issue where a
> >    discussion has to take place (i.e. copy or reference by default?
> >    possibility to change default via syntax? which lexical syntax?)
> >    before the proposal can be accepted.
> >
> >  * I provided patches for both lexical $var and use ($var) syntaxes.
> >
> >  * I provided a patch variant that only stores $this if $this is
> >    explicitely used inside a closure (or a nested closure of that
> >    closure). This works since it is possible to detect whether $this
> >    is used at compile time. For this, I have added a this_used flag
> >    to the op_array structure.
> >
> >  * I added tests (Zend/tests/closures_*.phpt) that ensure the correct
> >    behaviour of closures.
> >
> > [Note that I created my own local SVN repos for developing these
> > patches because I was fed up with CVS's inability to local diffs and
> > locally mark files as added to include them in the diffs. Just to
> > explain the format of the patch.]
> >
> > Anyway, feel free to discuss.
> >
> > In my eyes, the following questions should be answered:
> >
> >  * Do you want closures in PHP?
> >
> >    I have not seen a single negative reaction to my proposal, so I
> >    assume the answer to that is yes. ;-)
> >
> >  * Which syntax should be used for lexical variables? Should references
> >    or copies be created by default?
> >
> >    This is far trickier.
> >
> >    First of all: There must *always* be the _possiblity_ to create
> >    references, else you can't call it closures.
> >
> >    Second: I prefer the 'lexical' keyword, but I could live with the
> >    use solution [function () use ($...)].
> >
> >    Third: There are several arguments against default referencing:
> >
> >      * (use syntax) As they look similar to parameters and normal
> >                     parameters aren't passed by ref, this could be quite
> >                     odd.
> >      * Loop index WTFs (see proposal)
> >      * Speed? (You always read that refs are slower in PHP than normal
> >        variable copies. Is that actually true?)
> >      * While it is possible to simply add an & in front of the variable
> >        name to switch to refs in "no refs default" mode, there is no
> >        obvious syntax to use copies in "refs default" mode other than
> >        unsetting the variable in the parent scope immediately after
> >        closure creation.
> >
> >    Fourth: There are several arguments for default referencing:
> >
> >      * (lexical syntax) global also creates a reference, why shouldn't
> >                         lexical?
> >      * Other languages *appear* to exhibit a very similar behaviour to
> >        PHP if PHP created references. This is due to the fact that
> >        other languages have a different concept of scope as PHP
> >        does.
> >
> >    Although the list of against arguments appears to be longer, I do
> >    prefer using references by default nevertheless. But that's just
> >    my personal opinion.
> >
> >  * Are you OK with the change that $this is only stored when needed?
> >
> >    I don't see a problem. Dmitry seems to be very touchy (;-)) about
> >    changing op_arrays but in this case it's only a flag so I don't
> >    see a problem for opcode caches (in contrast to a HashTable where
> >    the opcode cache must actually add code to duplicate that table).
> >
> >  * Do you want closures in PHP 5.3?
> >
> >    Since the majority of core developers appear to be against it, I
> >    presume the answer is no.
> >
> > I will provide a revised patch that incorporates the results of the
> > following discussion for 5_3 and HEAD once consensus or at least a
> > majority regarding the remaining issues is reached. I will also
> > rewrite the proposal to reflect the discussion results and adjust the tests.
> > After that, I hope that someone will commit at least the HEAD version.
> >
> > Regards,
> > Christian

Reply via email to