Hi,
I didn't mark http://bugs.php.net/48541 as critical because it is not a
critical bug, but it is critical that this thing be fixed in PHP 5.3.
I can do it if someone can answer this question: how do closures
uniquely identify themselves? spl_autoload_register is mistakenly
treating all closures as if they were a single copy of the static method
"Closure::__invoke", and so only the first registered closure is ever
called (plus it leaks the other closures at shutdown). If the system
can be made to better identify the closure, then spl_autoload_register
can use that (and also properly free the refcount on a dupe).
Greg
Hi Greg,
I can do it if someone can answer this question: how do closures
uniquely identify themselves? spl_autoload_register is mistakenly
treating all closures as if they were a single copy of the static method
"Closure::__invoke", and so only the first registered closure is ever
called (plus it leaks the other closures at shutdown). If the system
can be made to better identify the closure, then spl_autoload_register
can use that (and also properly free the refcount on a dupe).
A closure can only be uniquely identified by the object storage id the
object has. You cannot assume any identity with regard to, for example,
file name and line where it was defined, since one could imagine the
following:
foreach ($dirs as $dir) {
spl_autoload_register (function ($class) use ($dir) {
include $dir.'/'.$class.'.php';
});
}
(or something like it)
If nobody else does it I'll fix this later today.
Regards,
Christian
Christian Seiler wrote:
Hi Greg,
I can do it if someone can answer this question: how do closures
uniquely identify themselves? spl_autoload_register is mistakenly
treating all closures as if they were a single copy of the static method
"Closure::__invoke", and so only the first registered closure is ever
called (plus it leaks the other closures at shutdown). If the system
can be made to better identify the closure, then spl_autoload_register
can use that (and also properly free the refcount on a dupe).A closure can only be uniquely identified by the object storage id the
object has. You cannot assume any identity with regard to, for example,
file name and line where it was defined, since one could imagine the
following:foreach ($dirs as $dir) {
spl_autoload_register (function ($class) use ($dir) {
include $dir.'/'.$class.'.php';
});
}(or something like it)
If nobody else does it I'll fix this later today.
Hi,
Thanks Christian, I've got a patch and a test I'm about to commit, would
be great if you can review it.
Thanks,
Greg