Description:
------------
Debug backtrace traditionally gives several pieces of information about the call
stack, including file name, line number, and function name. However, with
anonymous functions it simply gives "{closure}". This makes anonymous functions
received through debug_backtrace inaccesible through reflection because there is
no reference to them.
I propose that debug_backtrace always provide an additional key "reference" which
is a reference to the actual function. This will let the function be called or
provided to the reflection API.
Test script:
---------------
<?PHP
$anon = function() {
$name = (debug_backtrace[0]['name']); // yields {closure}
$refl = new ReflectionFunction($name); // works great except with closures!
echo $refl->getDocComment(); // fails
}
$anon();

Pull Requests

History

I think the naming can be improved. Reference is quite generic, why not to return
some reflection object if asked for?

[2012-06-17 11:22 UTC] anfurny22 at gmail dot com

I agree the key name is ambiguous, perhaps 'function_reference' instead of
'reference'.
I'm unclear what you're saying about "returning" a reflection object, please
elaborate.

[2016-06-07 10:33 UTC] contact at jaborandi dot org dot ru

Because of this lack of support for closure by debug_backtrace, it is impossible to get the scope of the closure from within the closure in case when $this was changed by binding closure to something else.
This problem remains in php 7.0.7

This needs to be fixes by at least providing a location where Closure was defined - filename + line.
Test code:
$fx = (function() {
print_r(debug_backtrace());
});
(function() use($fx) {
$fx();
})();
-> currently there is no way to identify/trace the location of the called Closure.
I see there is already patch for it here.
Can someone take a look at it?
If saving the Closure object is not desired, the location needs to be always accessible in order to be trace the actual trace output.