On Thursday 22 January 2009 8:21:28 am Christian Seiler wrote:
> Hi everybody,
>
> We had that chat that Lukas announced yesterday and I promised Lukas to
> sum up the results of that chat.
>
> Problem was: There were only four people really there: Stas, Lukas,
> David and me. Lukas was interested in getting results in order to be
> able to release PHP 5.3 beta 1, Stas and I basically agreed on
> everything and unfortunately David didn't stay long enough in order to
> actually have a real discussion.
>
> I'm not assigning blame here for not coming to anyone, I just wanted to
> make clear that we actually couldn't reach a consensus - or well,
> rather, Stas and I could but I don't think that's the way it should be.
> However, Lukas wants to release 5.3 beta 1 and I can really understand
> him that he doesn't want to drag this out infinitely.
>
> I've written up the results of the discussion I had with Stas in the
> Wiki for everyone to read. I hope there's enough structure in it to make
> the main points clear. Please read it thoroughly before replying on-list
> in order to actually have a constructive dialogue.
>
> Here it is: <http://wiki.php.net/rfc/closures/object-extension>

IMO, a very large part of the problem is the implicit binding of $this when a 
closure happens to be defined inside a method of a class.  Every other variable 
that the closure inherits needs to be defined explicitly; that not only helps 
the parser but helps human readers.  Having $this be magically bound seems 
like a cause for confusion later on down the road.

That said, I very much like the proposal given in the RFC.  Rebinding of a 
closure should be an explicit operation that a future reader of the code can 
visually see and therefore know about.  That removes any potential WTFs when 
$this is suddenly $that even though you didn't mean for it to be.

Regarding the details, wherein lives the devil:

- If a closure is bound to an object and does NOT make use of $this, do we 
still want to throw a warning if it is called?  In that case the binding is 
irrelevant anyway.  (That goes back to the point about an implicit initial 
bind, which I am still not convinced is wise.)

- IMO, once a closure has been bound to an object, its $this should have all 
the same access as a method defined literally on that object's class.  That is, 
it should have private/protected access the same as a "normal" method.

- I am a little unclear on what the expected cloning behavior is.  Do closures 
have a clone method?  Take the following example:

class A {
  function getClosure() {
    $var = new Foo();
    return function() use ($var) {
      return $var->something;
    }
  }
}

$a = new A;
$o = new stdClass();
$closure = $a->getClosure();
$o->foo = $closure->bindTo($o);

Now, are $closure->var and $o->foo->var the same object or no?  I'm assuming 
they are from the RFC, but then how do you implement a deep clone of the 
closure on binding if you need to?

-- 
Larry Garfield
la...@garfieldtech.com

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to