private static function dumpObject(&$var, $options, $level) { $fields = self::exportObject($var, $options[self::OBJECT_EXPORTERS]); $editor = NULL; if ($options[self::LOCATION] & self::LOCATION_CLASS) { $rc = $var instanceof \Closure ? new \ReflectionFunction($var) : new \ReflectionClass($var); $editor = Helpers::editorUri($rc->getFileName(), $rc->getStartLine()); } $out = '<span class="tracy-dump-object"' . ($editor ? Helpers::formatHtml(' title="Declared in file % on line %" data-tracy-href="%"', $rc->getFileName(), $rc->getStartLine(), $editor) : '') . '>' . htmlspecialchars(Helpers::getClass($var)) . '</span> <span class="tracy-dump-hash">#' . substr(md5(spl_object_hash($var)), 0, 4) . '</span>'; static $list = array(); if (empty($fields)) { return $out . "\n"; } elseif (in_array($var, $list, TRUE)) { return $out . " { <i>RECURSION</i> }\n"; } elseif (!$options[self::DEPTH] || $level < $options[self::DEPTH] || $var instanceof \Closure) { $collapsed = $level ? count($fields) >= $options[self::COLLAPSE_COUNT] : (is_int($options[self::COLLAPSE]) ? count($fields) >= $options[self::COLLAPSE] : $options[self::COLLAPSE]); $out = '<span class="tracy-toggle' . ($collapsed ? ' tracy-collapsed' : '') . '">' . $out . "</span>\n<div" . ($collapsed ? ' class="tracy-collapsed"' : '') . '>'; $list[] = $var; foreach ($fields as $k => &$v) { $vis = ''; if (isset($k[0]) && $k[0] === "") { $vis = ' <span class="tracy-dump-visibility">' . ($k[1] === '*' ? 'protected' : 'private') . '</span>'; $k = substr($k, strrpos($k, "") + 1); } $k = preg_match('#^\\w{1,50}\\z#', $k) ? $k : '"' . htmlspecialchars(self::encodeString($k, $options[self::TRUNCATE]), ENT_NOQUOTES, 'UTF-8') . '"'; $out .= '<span class="tracy-dump-indent"> ' . str_repeat('| ', $level) . '</span>' . '<span class="tracy-dump-key">' . $k . "</span>{$vis} => " . self::dumpVar($v, $options, $level + 1); } array_pop($list); return $out . '</div>'; } else { return $out . " { ... }\n"; } }