-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathWho.php
94 lines (78 loc) · 2.23 KB
/
Who.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
/**
* Utilitário de rastreamento de chamada
*
* @codingStandard PSR2
* @author J. Augusto <augustowebd@gmail.com>
* @version 0.0.1
* */
final class Who
{
private function __construct()
{
}
/**
* @return stdClass
* */
public static function callme()
{
return self::parser(current(self::tracker()));
}
/**
* @return stdClass
* */
public static function followme()
{
$return =
$swap = null;
$tracker = self::tracker();
array_pop($tracker);
for ($i = 0, $len = count($tracker); $i < $len;) {
$iNext = $i + 1;
$result = self::parser($tracker[$i]);
if (null === $swap) {
$return =
$swap = &$result;
}
$swap->href = null;
if (isset($tracker[$iNext])) {
$swap->href = self::parser($tracker[$iNext]);
$swap = &$swap->href;
}
$i = $iNext;
}
return $return;
}
private static function tracker()
{
if (function_exists('debug_backtrace')) {
return array_reverse(debug_backtrace());
}
$eTracker = new \Exception;
return array_reverse($eTracker->getTrace());
}
private static function parser($stack)
{
$return = new \stdClass;
$return->source = $stack['file'];
$return->caller = $stack['function'] === '{closure}' ? '?' : $stack['function'];
$return->type = (isset($stack['class']) ? 'method' : 'function');
$return->line = $stack['line'];
if (isset($stack['class'])) {
$return->caller = $stack['class'] . $stack['type'] . $return->caller;
}
if (count($stack['args'])) {
foreach ($stack['args'] as $pos => $val) {
$return->args[$pos] = new \stdClass;
$return->args[$pos]->pos = $pos;
$return->args[$pos]->type = gettype($val);
$return->args[$pos]->value = $val;
}
}
if ('call' == $return->caller) {
$return->caller =
$return->type = null;
}
return $return;
}
}