/** * Helper for Debug::dump(), handles recursion in arrays and objects. * @param string $var * @param int $length * @param int $level * @return string */ protected static function _dump($var, $length = 128, $level = 0) { if ($var === null) { return '<small>null</small>'; } elseif (is_bool($var)) { return '<small>bool</small> ' . ($var ? 'TRUE' : 'FALSE'); } elseif (is_float($var)) { return '<small>float</small> ' . $var; } elseif (is_resource($var)) { if (($type = get_resource_type($var)) === 'stream' and $meta = stream_get_meta_data($var)) { $meta = stream_get_meta_data($var); if (isset($meta['uri'])) { return '<small>resource</small><span>(' . $type . ')</span> ' . htmlspecialchars($meta['uri'], ENT_NOQUOTES); } } else { return '<small>resource</small><span>(' . $type . ')</span>'; } } elseif (is_string($var)) { // Encode the string $str = htmlspecialchars($var, ENT_NOQUOTES); return '<small>string</small><span>(' . strlen($var) . ')</span> "' . $str . '"'; } elseif (is_array($var)) { $output = array(); // Indentation for this variable $space = str_repeat($s = ' ', $level); static $marker; if ($marker === null) { // Make a unique marker $marker = uniqid(""); } if (empty($var)) { // Do nothing } elseif (isset($var[$marker])) { $output[] = "(" . EXIDO_EOL . "{$space}{$s}*RECURSION*" . EXIDO_EOL . "{$space})"; } elseif ($level < 5) { $output[] = "<span>("; $var[$marker] = true; foreach ($var as $key => &$val) { if ($key === $marker) { continue; } if (!is_int($key)) { $key = '"' . htmlspecialchars($key, ENT_NOQUOTES, __('__charset')) . '"'; } $output[] = "{$space}{$s}{$key} => " . Debug::_dump($val, $length, $level + 1); } unset($var[$marker]); $output[] = "{$space})</span>"; } else { // Depth too great $output[] = "(" . EXIDO_EOL . "{$space}{$s}..." . EXIDO_EOL . "{$space})"; } return '<small>array</small><span>(' . count($var) . ')</span> ' . implode(EXIDO_EOL, $output); } elseif (is_object($var)) { // Copy the object as an array $array = (array) $var; $output = array(); // Indentation for this variable $space = str_repeat($s = ' ', $level); $hash = spl_object_hash($var); // Objects that are being dumped static $objects = array(); if (empty($var)) { // Do nothing } elseif (isset($objects[$hash])) { $output[] = "{" . EXIDO_EOL . "{$space}{$s}*RECURSION*" . EXIDO_EOL . "{$space}}"; } elseif ($level < 10) { $output[] = "<code>{"; $objects[$hash] = true; foreach ($array as $key => &$val) { if ($key[0] === "") { // Determine if the access is protected or protected $access = '<small>' . ($key[1] === '*' ? 'protected' : 'private') . '</small>'; // Remove the access level from the variable name $key = substr($key, strrpos($key, "") + 1); } else { $access = '<small>public</small>'; } $output[] = "{$space}{$s}{$access} {$key} => " . Debug::_dump($val, $length, $level + 1); } unset($objects[$hash]); $output[] = "{$space}}</code>"; } else { // Depth too great $output[] = "{" . EXIDO_EOL . "{$space}{$s}..." . EXIDO_EOL . "{$space}}"; } return '<small>object</small> <span>' . get_class($var) . '(' . count($array) . ')</span> ' . implode(EXIDO_EOL, $output); } else { return '<small>' . gettype($var) . '</small> ' . htmlspecialchars(print_r($var, true), ENT_NOQUOTES); } }
/** * Helper for Debug::dump(), handles recursion in arrays and objects. * * @param mixed variable to dump * @param integer maximum length of strings * @param integer recursion level (internal) * @return string */ protected static function _dump(&$var, $length = 128, $level = 0) { if ($var === NULL) { return '<small>NULL</small>'; } elseif (is_bool($var)) { return '<small>bool</small> ' . ($var ? 'TRUE' : 'FALSE'); } elseif (is_float($var)) { return '<small>float</small> ' . $var; } elseif (is_resource($var)) { if (($type = get_resource_type($var)) === 'stream' and $meta = stream_get_meta_data($var)) { $meta = stream_get_meta_data($var); if (isset($meta['uri'])) { $file = $meta['uri']; if (function_exists('stream_is_local')) { // Only exists on PHP >= 5.2.4 if (stream_is_local($file)) { $file = Debug::path($file); } } return '<small>resource</small><span>(' . $type . ')</span> ' . htmlspecialchars($file, ENT_NOQUOTES, Kohana::$charset); } } else { return '<small>resource</small><span>(' . $type . ')</span>'; } } elseif (is_string($var)) { // Clean invalid multibyte characters. iconv is only invoked // if there are non ASCII characters in the string, so this // isn't too much of a hit. $var = UTF8::clean($var, Kohana::$charset); if (UTF8::strlen($var) > $length) { // Encode the truncated string $str = htmlspecialchars(UTF8::substr($var, 0, $length), ENT_NOQUOTES, Kohana::$charset) . ' …'; } else { // Encode the string $str = htmlspecialchars($var, ENT_NOQUOTES, Kohana::$charset); } return '<small>string</small><span>(' . strlen($var) . ')</span> "' . $str . '"'; } elseif (is_array($var)) { $output = array(); // Indentation for this variable $space = str_repeat($s = ' ', $level); static $marker; if ($marker === NULL) { // Make a unique marker $marker = uniqid(""); } if (empty($var)) { // Do nothing } elseif (isset($var[$marker])) { $output[] = "(\n{$space}{$s}*RECURSION*\n{$space})"; } elseif ($level < 5) { $output[] = "<span>("; $var[$marker] = TRUE; foreach ($var as $key => &$val) { if ($key === $marker) { continue; } if (!is_int($key)) { $key = '"' . htmlspecialchars($key, ENT_NOQUOTES, Kohana::$charset) . '"'; } $output[] = "{$space}{$s}{$key} => " . Debug::_dump($val, $length, $level + 1); } unset($var[$marker]); $output[] = "{$space})</span>"; } else { // Depth too great $output[] = "(\n{$space}{$s}...\n{$space})"; } return '<small>array</small><span>(' . count($var) . ')</span> ' . implode("\n", $output); } elseif (is_object($var)) { // Copy the object as an array $array = (array) $var; $output = array(); // Indentation for this variable $space = str_repeat($s = ' ', $level); $hash = spl_object_hash($var); // Objects that are being dumped static $objects = array(); if (empty($var)) { // Do nothing } elseif (isset($objects[$hash])) { $output[] = "{\n{$space}{$s}*RECURSION*\n{$space}}"; } elseif ($level < 10) { $output[] = "<code>{"; $objects[$hash] = TRUE; foreach ($array as $key => &$val) { if ($key[0] === "") { // Determine if the access is protected or protected $access = '<small>' . ($key[1] === '*' ? 'protected' : 'private') . '</small>'; // Remove the access level from the variable name $key = substr($key, strrpos($key, "") + 1); } else { $access = '<small>public</small>'; } $output[] = "{$space}{$s}{$access} {$key} => " . Debug::_dump($val, $length, $level + 1); } unset($objects[$hash]); $output[] = "{$space}}</code>"; } else { // Depth too great $output[] = "{\n{$space}{$s}...\n{$space}}"; } return '<small>object</small> <span>' . get_class($var) . '(' . count($array) . ')</span> ' . implode("\n", $output); } else { return '<small>' . gettype($var) . '</small> ' . htmlspecialchars(print_r($var, TRUE), ENT_NOQUOTES, Kohana::$charset); } }
/** * Returns an HTML string of information about a single variable. * * Borrows heavily on concepts from the Debug class of [Nette](http://nettephp.com/). * * @param mixed $value variable to dump * @param integer $length maximum length of strings * @param integer $level_recursion recursion limit * * @return string */ public static function dump($value, $length = 128, $level_recursion = 10) { return Debug::_dump($value, $length, $level_recursion); }
/** * Helper for Debug::dump(), handles recursion in arrays and objects. * * @param mixed $var variable to dump * @param integer $length maximum length of strings * @param integer $limit recursion limit * @param integer $level current recursion level (internal usage only!) * @return string */ protected static function _dump(&$var, $length = 128, $limit = 10, $level = 0) { if ($var === null) { return '<small>null</small>'; } elseif (is_int($var)) { return '<small>integer</small> <span class="int">' . $var . '</span>'; } elseif (is_bool($var)) { return '<small>bool</small> <span class="bool">' . ($var ? 'true' : 'false') . '</span>'; } elseif (is_float($var)) { return '<small>float</small> <span class="float">' . $var . '</span>'; } elseif (is_resource($var)) { if (($type = get_resource_type($var)) === 'stream' && ($meta = stream_get_meta_data($var))) { $meta = stream_get_meta_data($var); if (isset($meta['uri'])) { $file = $meta['uri']; // Only exists on PHP >= 5.2.4 if (stream_is_local($file)) { $file = Debug::path($file); } return '<small>resource</small><span>(' . $type . ')</span> ' . htmlspecialchars($file, ENT_NOQUOTES, \Phalcana\Phalcana::$charset); } } else { return '<small>resource</small><span>(' . $type . ')</span>'; } } elseif (is_string($var)) { // Clean invalid multibyte characters. iconv is only invoked // if there are non ASCII characters in the string, so this // isn't too much of a hit. $var = UTF8::clean($var, \Phalcana\Phalcana::$charset); if (UTF8::strlen($var) > $length) { // Encode the truncated string $str = htmlspecialchars(UTF8::substr($var, 0, $length), ENT_NOQUOTES, \Phalcana\Phalcana::$charset) . ' …'; //$str = htmlspecialchars(substr($var, 0, $length), ENT_NOQUOTES, \Phalcana\Phalcana::$charset).' …'; } else { // Encode the string $str = htmlspecialchars($var, ENT_NOQUOTES, \Phalcana\Phalcana::$charset); } return '<small>string</small><span class="len">(' . strlen($var) . ')</span> <span class="string">"' . $str . '"</span>'; } elseif (is_array($var)) { $output = array(); // Indentation for this variable $space = str_repeat($s = ' ', $level); static $marker; if ($marker === null) { // Make a unique marker - force it to be alphanumeric so that it is always treated as a string array key $marker = uniqid("") . "x"; } if (empty($var)) { // Do nothing } elseif (isset($var[$marker])) { $output[] = "(\n{$space}{$s}*RECURSION*\n{$space})"; } elseif ($level < $limit) { $output[] = "<span>("; $var[$marker] = true; foreach ($var as $key => &$val) { if ($key === $marker) { continue; } if (!is_int($key)) { $key = '<span class="string">"' . htmlspecialchars($key, ENT_NOQUOTES, \Phalcana\Phalcana::$charset) . '"</span>'; } else { $key = '<span class="int">' . $key . '</span>'; } $output[] = "{$space}{$s}{$key} <span class=\"pointer\">=></span> " . Debug::_dump($val, $length, $limit, $level + 1); } unset($var[$marker]); $output[] = "{$space})</span>"; } else { // Depth too great $output[] = "(\n{$space}{$s}...\n{$space})"; } return '<small>array</small><span class="len">(' . count($var) . ')</span> ' . implode("\n", $output); } elseif (is_object($var)) { // Copy the object as an array $array = (array) $var; $output = array(); // Indentation for this variable $space = str_repeat($s = ' ', $level); $hash = spl_object_hash($var); // Objects that are being dumped static $objects = array(); if (empty($var)) { // Do nothing } elseif ($var instanceof \Phalcon\DI) { $output[] = "{\n{$space}{$s}*DEPENDENCY INJECTOR IGNORED*\n{$space}}"; } elseif (isset($objects[$hash])) { $output[] = "{\n{$space}{$s}*RECURSION*\n{$space}}"; } elseif ($level < $limit) { $output[] = "<code>{"; $objects[$hash] = true; foreach ($array as $key => &$val) { if ($key[0] === "") { // Determine if the access is protected or protected $access = '<small>' . ($key[1] === '*' ? 'protected' : 'private') . '</small>'; // Remove the access level from the variable name $key = substr($key, strrpos($key, "") + 1); } else { $access = '<small>public</small>'; } $output[] = "{$space}{$s}{$access} {$key} <span class=\"pointer\">=></span> " . Debug::_dump($val, $length, $limit, $level + 1); } unset($objects[$hash]); $output[] = "{$space}}</code>"; } else { // Depth too great $output[] = "{\n{$space}{$s}...\n{$space}}"; } return '<small>object</small> <span>' . get_class($var) . '(' . count($array) . ')</span> ' . implode("\n", $output); } else { return '<small>' . gettype($var) . '</small> ' . htmlspecialchars(print_r($var, true), ENT_NOQUOTES, \Phalcana\Phalcana::$charset); } }
protected static function _dump(&$var, $length = 128, $limit = 10, $level = 0) { if ($var === NULL) { return "<small>NULL</small>"; } elseif (is_bool($var)) { return "<small>bool</small> " . ($var ? "TRUE" : "FALSE"); } elseif (is_float($var)) { return "<small>float</small> " . $var; } elseif (is_resource($var)) { if (($type = get_resource_type($var)) === "stream" and $meta = stream_get_meta_data($var)) { $meta = stream_get_meta_data($var); if (isset($meta["uri"])) { $file = $meta["uri"]; if (function_exists("stream_is_local")) { // Only exists on PHP >= 5.2.4 if (stream_is_local($file)) { $file = Debug::path($file); } } return "<small>resource</small><span>(" . $type . ")</span> " . htmlspecialchars($file, ENT_NOQUOTES, JsonApiApplication::$charset); } } else { return "<small>resource</small><span>(" . $type . ")</span>"; } } elseif (is_string($var)) { $var = UTF8::clean($var, JsonApiApplication::$charset); if (UTF8::strlen($var) > $length) { $str = htmlspecialchars(UTF8::substr($var, 0, $length), ENT_NOQUOTES, JsonApiApplication::$charset) . " …"; } else { $str = htmlspecialchars($var, ENT_NOQUOTES, JsonApiApplication::$charset); } return '<small>string</small><span>(' . strlen($var) . ')</span> "' . $str . '"'; } elseif (is_array($var)) { $output = array(); $space = str_repeat($s = " ", $level); static $marker; if ($marker === NULL) { $marker = uniqid("") . "x"; } if (empty($var)) { // Do nothing } elseif (isset($var[$marker])) { $output[] = "(\n{$space}{$s}*RECURSION*\n{$space})"; } elseif ($level < $limit) { $output[] = "<span>("; $var[$marker] = TRUE; foreach ($var as $key => &$val) { if ($key === $marker) { continue; } if (!is_int($key)) { $key = '"' . htmlspecialchars($key, ENT_NOQUOTES, JsonApiApplication::$charset) . '"'; } $output[] = "{$space}{$s}{$key} => " . Debug::_dump($val, $length, $limit, $level + 1); } unset($var[$marker]); $output[] = "{$space})</span>"; } else { $output[] = "(\n{$space}{$s}...\n{$space})"; } return "<small>array</small><span>(" . count($var) . ")</span> " . implode("\n", $output); } elseif (is_object($var)) { $array = (array) $var; $output = array(); $space = str_repeat($s = " ", $level); $hash = spl_object_hash($var); static $objects = array(); if (empty($var)) { // Do nothing } elseif (isset($objects[$hash])) { $output[] = "{\n{$space}{$s}*RECURSION*\n{$space}}"; } elseif ($level < $limit) { $output[] = "<code>{"; $objects[$hash] = TRUE; foreach ($array as $key => &$val) { if ($key[0] === "") { $access = "<small>" . ($key[1] === "*" ? "protected" : "private") . "</small>"; $key = substr($key, strrpos($key, "") + 1); } else { $access = "<small>public</small>"; } $output[] = "{$space}{$s}{$access} {$key} => " . Debug::_dump($val, $length, $limit, $level + 1); } unset($objects[$hash]); $output[] = "{$space}}</code>"; } else { // Depth too great $output[] = "{\n{$space}{$s}...\n{$space}}"; } return "<small>object</small> <span>" . get_class($var) . "(" . count($array) . ")</span> " . implode("\n", $output); } else { return "<small>" . gettype($var) . "</small> " . htmlspecialchars(print_r($var, TRUE), ENT_NOQUOTES, JsonApiApplication::$charset); } }