/** * Get trace summary HTML string * * <code> * echo getTraceSummary(debug_backtrace()); //output trace summary * </code> * * @param array $debuBackTrace trace data * * @return void */ public static function getTraceSummary($debuBackTrace = null) { $debuBackTrace = is_null($debuBackTrace) ? debug_backtrace() : $debuBackTrace; $traceLevels = array_keys($debuBackTrace); $i = 0; $traceSummary = ''; foreach ($traceLevels as $level) { $trace = $debuBackTrace[$level]; if (isset($trace['file'])) { $file = $trace['file']; $line = $trace['line']; $fileArray = file($file); $hitLine = $fileArray[$line - 1]; } elseif (isset($trace['class']) && isset($trace['function'])) { $ref = new ReflectionMethod($trace['class'], $trace['function']); $file = $ref->getFileName(); $line = $ref->getStartLine(); $fileArray = file($file); $hitLine = $fileArray[$line - 1]; } elseif (isset($trace['function'])) { $ref = new ReflectionFunction($trace['function']); $file = $ref->getFileName(); $line = $ref->getStartLine(); $fileArray = $file ? file($file) : array(); $hitLine = $file ? $fileArray[$line - 1] : ''; } else { $file = false; $hitLine = 'n/a'; } $hitLine = trim($hitLine); $args = array(); if (isset($trace['args'])) { foreach ($trace['args'] as $arg) { if (is_array($arg)) { $args[] = 'Array'; } elseif (is_string($arg)) { $args[] = "'{$arg}'"; } elseif (is_scalar($arg)) { $args[] = $arg; } else { $args[] = 'Object'; } } } if (isset($trace['class'])) { $hitInfo = "{$trace['class']}{$trace['type']}{$trace['function']}({$args}) "; } elseif (isset($trace['function'])) { $hitInfo = "{$trace['function']}({$args}) "; } else { $hitInfo = ''; } $args = implode(',', $args); $traceSummary .= '<li><span class="timeline-num">' . $i . '</span>'; $traceSummary .= '<span class="timeline-body">' . $hitLine . '</span>'; $traceSummary .= '<span class="timeline-info">' . $hitInfo . '<br />'; $traceSummary .= $file ? Panda::getEditorLink($file, $line) : ''; $traceSummary .= '</span></li>'; $i++; } $traceSummary = '<ol id="trace-summary" class="timeline">' . $traceSummary . '</ol>'; return $traceSummary; }