php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #62325 Debug Backtrace gives no handle to anonymous functions
Submitted: 2012-06-14 17:25 UTC Modified: 2020-04-08 16:47 UTC
Votes:10
Avg. Score:4.1 ± 0.8
Reproduced:7 of 7 (100.0%)
Same Version:2 (28.6%)
Same OS:2 (28.6%)
From: anfurny22 at gmail dot com Assigned:
Status: Open Package: *General Issues
PHP Version: any OS: any
Private report: No CVE-ID: None
 [2012-06-14 17:25 UTC] anfurny22 at gmail dot com
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();


Patches

Improved_Debug_Backtrace_for_anonymous_functions (last revision 2012-06-17 10:56 UTC by anfurny22 at gmail dot com)

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-06-17 11:01 UTC] hanskrentel at yahoo dot de
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
 [2020-04-08 16:47 UTC] daverandom@php.net
-Operating System: Windows +Operating System: any -PHP Version: 5.4.4 +PHP Version: any
 [2020-04-10 19:03 UTC] michael dot vorisek at email dot cz
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.
 [2024-06-21 06:55 UTC] chris1058wright at outlook dot com
Thanks for sharing this amazing information. (https://github.com)(https://www.receiptify.net)
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 12:01:29 2024 UTC