On 17 Aug 2014, at 22:36, Levi Morrison <le...@php.net> wrote:

> I have a small clarification question on the RFC: you are adding
> another parameter to bindTo which defaults to false, but I didn't
> quite understand the reasoning. Can you try explaining that to me in a
> different way?

I’ll give it a go.

Closures have a bound object and a scope. The bound object is whatever $this 
will be set to when that closure is called. The scope is the class whose 
private variables can be seen by a closure.

->call() will call the closure and use its existing scope but the bound object 
will be what is passed as its first parameter. ->call() doesn’t permit calling 
with a different scope.

This presents a conundrum, however, if you want to use ->call() with a closure 
and you want to have a scope. Currently, ::bind() and ->bindTo() only permit 
two types of closures with scopes: those that are static (can’t have $this 
bound) and those that have an object bound. This means to create a closure with 
a scope that you can then use with ->call(), you’d have to make one with a 
dummy object already bound. In most cases you can do this, but there are a few 
you can’t, and it’s weird to have to bind an object when we’re not going to use 
it anyway as ->call() is going to override it.

For this reason, a third parameter is added to ::bind() and ->bindTo() which 
makes it produce an unbound, scoped closure rather than a static scoped closure 
if we don’t pass an object to be bound and we specify a scope. The need for the 
third parameter is really just backwards-compatibility. At the moment, if you 
pass  NULL for the object to bind to and pass a class name for the scope, it’ll 
make a static closure. We could change this and make it produce an unbound 
closure and add some other mechanism to obtain a static closure, but that would 
break backwards-compatibility. For this reason, we instead add a third 
parameter to say, yes, we do want an unbound closure. The same thing is done 
internally too, with zend_create_closure_ex.

On 17 Aug 2014, at 22:55, Stas Malyshev <smalys...@sugarcrm.com> wrote:

> Hi!
> 
>> I have a small clarification question on the RFC: you are adding
>> another parameter to bindTo which defaults to false, but I didn't
>> quite understand the reasoning. Can you try explaining that to me in a
>> different way?
> 
> Interestingly enough, the RFC doesn't even mention this change.


It does, but maybe you missed it. Under the Proposal section:

> To solve this, we relax the current invariant of scoped closures having to be 
> bound, and add a new parameter to bind(To) to produce an unbound, scoped 
> closure, like so:

--
Andrea Faulds
http://ajf.me/





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

Reply via email to