A week ago, I sent an e-mail to internals regarding two closure
optimizations with some subtle BC breaks. [1] While nobody objected, I
decided to create a short RFC anyway to avoid any possible controversy
due to the BC breaks. You can find it here:
Le 31 janv. 2026 à 00:43, Ilija Tovilo <tovilo.ilija@gmail.com> a écrit :
Hi everyone
A week ago, I sent an e-mail to internals regarding two closure
optimizations with some subtle BC breaks. [1] While nobody objected, I
decided to create a short RFC anyway to avoid any possible controversy
due to the BC breaks. You can find it here:
Hi everyone
A week ago, I sent an e-mail to internals regarding two closure
optimizations with some subtle BC breaks. [1] While nobody objected, I
decided to create a short RFC anyway to avoid any possible controversy
due to the BC breaks. You can find it here:
[https://wiki.php.net/rfc/closure-optimizations](https://wiki.php.net/rfc/closure-optimizations)
Regards,
Ilija
[1] [https://externals.io/message/129825](https://externals.io/message/129825)
I’m a bit disappointed that you felt necessary to introduce bureaucracy for a straightforward very minor BC break. I don’t like this something to become necessary or expected in future. Sending that email was completely sufficient.
I would like to encourage you to recognize that and simply merge your pull request.
I'm a bit disappointed that you felt necessary to introduce bureaucracy for a straightforward very minor BC break. I don't like this something to become necessary or expected in future. Sending that email was completely sufficient.
I would like to encourage you to recognize that and simply merge your pull request.
I agree that the BC break is fairly minimal. What made me decide to
create an RFC after all is highlighted here:
ReflectionFunction::getClosureThis() will now return NULL for closures that are inferred as static. This might be slightly surprising, given static inference does not work 100% reliably, limited by the rules previously described.
ReflectionFunction::getClosureThis() will work as long as the closure
uses $this, but it will also work if it calls static methods. Once you
remove the static call, it will break. Now, I don't think
ReflectionFunction::getClosureThis() is something many people rely on,
nor should they, but it is nonetheless surprising. I'd like to avoid
the situation where this is categorized as a bug that is effectively
impossible to solve without removing the optimization.
Thank you for this improvement. If I understand correctly, one of the predicted BC changes will fix one of the issues with unit test comparisons.
The sebastianbergmann/comparator library cannot compare closures, because each closure is in fact a different instance. With your change, this might be resolved for static closures. So I see this is in fact very beneficial for the unit testing.
A week ago, I sent an e-mail to internals regarding two closure
optimizations with some subtle BC breaks. [1] While nobody objected, I
decided to create a short RFC anyway to avoid any possible controversy
due to the BC breaks. You can find it here: