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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: anfurny22 at gmail dot com
New email:
PHP Version: OS:

 

 [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 17:01:32 2024 UTC