Hi Larry

On Thu, Jan 22, 2026 at 5:03 PM Larry Garfield <[email protected]> wrote:
>
> On Wed, Jan 21, 2026, at 1:52 PM, Ilija Tovilo wrote:
> >
> > I've created a PR implementing two new optimizations for closures. [1]
> > There are some theoretical BC breaks, so please let me know if any of
> > them are of concern to you.
> >
> > Of note is that Closure::bind() and Closure::bindTo() usually throw
> > when attempting to bind an object to a static closure. In my PR, this
> > is explicitly allowed only for closures that are inferred as static,
> > but not those that are explicitly static.
> >
> >
> > [1] https://github.com/php/php-src/pull/19941
>
> This all looks great, Ilija!  I am not concerned about the BC mentions, as 
> they seem to be accurate anyway.
>
> My one question is about the bindTo() on an inferred static closure.  What 
> purpose does that serve?  I'm assuming that anything that mentions $this in 
> its body won't be marked static, and if it doesn't have $this I don't get 
> what value bindTo() would have.  What's the use case for making an exception 
> here?

Oops, it seems I've left out some details I was meaning to add. The
aim for allowing the passing of objects to Closure::bind[To]() is to
retain BC when a closure can suddenly be inferred as static due to
seemingly unrelated changes.

As mentioned, the rules for when static can be inferred are slightly
esoteric. For example, your code may be calling Foo::bar(), which
_looks_ like a static call, but could actually be an instance
grand-parent call (https://3v4l.org/uDi8W#v8.4.14). If you were to
remove this ambiguous call, and the closure could now be inferred as
static, it would be bad if existing Closure::bind[To]() calls would
break because they provide an object. For this reason,
Closure::bind[To]() will _accept but discard_ objects only for
closures inferred as static.

Ilija

Reply via email to