8
8
use Exception ;
9
9
use phpDocumentor \Reflection \DocBlock \Tag ;
10
10
use ReflectionClass ;
11
+ use ReflectionException ;
11
12
use ReflectionFunction ;
12
13
use Throwable ;
13
14
use function array_map ;
14
- use function array_walk_recursive ;
15
15
use function get_class ;
16
16
use function get_resource_type ;
17
+ use function is_array ;
17
18
use function is_object ;
18
19
use function is_resource ;
19
20
use function sprintf ;
@@ -80,29 +81,12 @@ private function flattenExceptionBacktrace(Throwable $exception) : void
80
81
$ traceProperty = (new ReflectionClass (Exception::class))->getProperty ('trace ' );
81
82
$ traceProperty ->setAccessible (true );
82
83
83
- $ flatten =
84
- /** @param mixed $value */
85
- static function (&$ value ) : void {
86
- if ($ value instanceof Closure) {
87
- $ closureReflection = new ReflectionFunction ($ value );
88
- $ value = sprintf (
89
- '(Closure at %s:%s) ' ,
90
- $ closureReflection ->getFileName (),
91
- $ closureReflection ->getStartLine ()
92
- );
93
- } elseif (is_object ($ value )) {
94
- $ value = sprintf ('object(%s) ' , get_class ($ value ));
95
- } elseif (is_resource ($ value )) {
96
- $ value = sprintf ('resource(%s) ' , get_resource_type ($ value ));
97
- }
98
- };
99
-
100
84
do {
101
85
$ trace = $ exception ->getTrace ();
102
86
if (isset ($ trace [0 ]['args ' ])) {
103
87
$ trace = array_map (
104
- static function (array $ call) use ( $ flatten ) : array {
105
- array_walk_recursive ( $ call ['args ' ], $ flatten );
88
+ function (array $ call ) : array {
89
+ $ call ['args ' ] = array_map ([ $ this , ' flattenArguments ' ], $ call [ ' args ' ] );
106
90
107
91
return $ call ;
108
92
},
@@ -117,6 +101,33 @@ static function (array $call) use ($flatten) : array {
117
101
$ traceProperty ->setAccessible (false );
118
102
}
119
103
104
+ /**
105
+ * @param mixed $value
106
+ *
107
+ * @return mixed
108
+ *
109
+ * @throws ReflectionException
110
+ */
111
+ private function flattenArguments ($ value )
112
+ {
113
+ if ($ value instanceof Closure) {
114
+ $ closureReflection = new ReflectionFunction ($ value );
115
+ $ value = sprintf (
116
+ '(Closure at %s:%s) ' ,
117
+ $ closureReflection ->getFileName (),
118
+ $ closureReflection ->getStartLine ()
119
+ );
120
+ } elseif (is_object ($ value )) {
121
+ $ value = sprintf ('object(%s) ' , get_class ($ value ));
122
+ } elseif (is_resource ($ value )) {
123
+ $ value = sprintf ('resource(%s) ' , get_resource_type ($ value ));
124
+ } elseif (is_array ($ value )) {
125
+ $ value = array_map ([$ this , 'flattenArguments ' ], $ value );
126
+ }
127
+
128
+ return $ value ;
129
+ }
130
+
120
131
public function render (?Formatter $ formatter = null ) : string
121
132
{
122
133
if ($ formatter === null ) {
0 commit comments