lithium\analysis\Debugger::trace PHP Method

trace() public static method

Outputs a stack trace based on the supplied options.
public static trace ( array $options = [] ) : string | array | null
$options array Format for outputting stack trace. Available options are: - `'args'`: A boolean indicating if arguments should be included. - `'depth'`: The maximum depth of the trace. - `'format'`: Either `null`, `'points'` or `'array'`. - `'includeScope'`: A boolean indicating if items within scope should be included. - `'scope'`: Scope for items to include. - `'start'`: The depth to start with. - `'trace'`: A trace to use instead of generating one.
return string | array | null Stack trace formatted according to `'format'` option.
    public static function trace(array $options = array())
    {
        $defaults = array('depth' => 999, 'format' => null, 'args' => false, 'start' => 0, 'scope' => array(), 'trace' => array(), 'includeScope' => true, 'closures' => true);
        $options += $defaults;
        $backtrace = $options['trace'] ?: debug_backtrace();
        $scope = $options['scope'];
        $count = count($backtrace);
        $back = array();
        $traceDefault = array('line' => '??', 'file' => '[internal]', 'class' => null, 'function' => '[main]');
        for ($i = $options['start']; $i < $count && $i < $options['depth']; $i++) {
            $trace = array_merge(array('file' => '[internal]', 'line' => '??'), $backtrace[$i]);
            $function = '[main]';
            if (isset($backtrace[$i + 1])) {
                $next = $backtrace[$i + 1] + $traceDefault;
                $function = $next['function'];
                if (!empty($next['class'])) {
                    $function = $next['class'] . '::' . $function . '(';
                    if ($options['args'] && isset($next['args'])) {
                        $args = array_map(array('static', 'export'), $next['args']);
                        $function .= join(', ', $args);
                    }
                    $function .= ')';
                }
            }
            if ($options['closures'] && strpos($function, '{closure}') !== false) {
                $function = static::_closureDef($backtrace[$i], $function);
            }
            if (in_array($function, array('call_user_func_array', 'trigger_error'))) {
                continue;
            }
            $trace['functionRef'] = $function;
            if ($options['format'] === 'points' && $trace['file'] !== '[internal]') {
                $back[] = array('file' => $trace['file'], 'line' => $trace['line']);
            } elseif (is_string($options['format']) && $options['format'] !== 'array') {
                $back[] = String::insert($options['format'], array_map(function ($data) {
                    return is_object($data) ? get_class($data) : $data;
                }, $trace));
            } elseif (empty($options['format'])) {
                $back[] = $function . ' - ' . $trace['file'] . ', line ' . $trace['line'];
            } else {
                $back[] = $trace;
            }
            if (!empty($scope) && array_intersect_assoc($scope, $trace) == $scope) {
                if (!$options['includeScope']) {
                    $back = array_slice($back, 0, count($back) - 1);
                }
                break;
            }
        }
        if ($options['format'] === 'array' || $options['format'] === 'points') {
            return $back;
        }
        return join("\n", $back);
    }

Usage Example

Example #1
0
 public static function __callStatic($priority = 'debug', $params = array())
 {
     $trace = Debugger::trace(array('format' => 'array', 'depth' => 3, 'includeScope' => false));
     $trace = $trace[2];
     if (empty($trace)) {
         throw UnexpectedValueException('Could not trace method');
     }
     $trace = array('method' => $trace['functionRef'], 'line' => $trace['line'], 'file' => $trace['file']);
     $message = "//////////// {$trace['file']}:{$trace['line']} -> {$trace['method']} ////////////\n";
     foreach ($params as $param) {
         $dump = Debugger::export($param);
         $message = "{$message}{$dump}\n";
     }
     return parent::write($priority, $message);
 }
All Usage Examples Of lithium\analysis\Debugger::trace