Guest User

Debug function extracted from Nette framework (http://nette.org/)

a guest
Oct 5th, 2010
621
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.32 KB | None | 0 0
  1. function dump($var, $return = FALSE)
  2. {
  3.    $output = "<pre class=\"dump\">" . _dump($var, 0) . "</pre>\n";
  4.  
  5.    if (!$return)
  6.    {
  7.       $trace = debug_backtrace();
  8.       $i = isset($trace[1]['class']) && $trace[1]['class'] === __CLASS__ ? 1 : 0;
  9.       if (isset($trace[$i]['file'], $trace[$i]['line']))
  10.       {
  11.      $output = substr_replace($output, ' <small>' . htmlspecialchars("in file {$trace[$i]['file']} on line {$trace[$i]['line']}", ENT_NOQUOTES) . '</small>', -8, 0);
  12.       }
  13.    }
  14.  
  15.    if ($return)
  16.    {
  17.       return $output;
  18.    }
  19.    else
  20.    {
  21.       echo $output;
  22.       return $var;
  23.    }
  24. }
  25.  
  26. function _dump(&$var, $level)
  27. {
  28.    $maxDepth = 4;
  29.    $maxLen = 250;
  30.    
  31.    $tableUtf = $tableBin = array();
  32.    $reBinary = '#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u';
  33.    if ($tableUtf === NULL)
  34.    {
  35.       foreach (range("\x00", "\xFF") as $ch)
  36.       {
  37.      if (ord($ch) < 32 && strpos("\r\n\t", $ch) === FALSE)
  38.         $tableUtf[$ch] = $tableBin[$ch] = '\\x' . str_pad(dechex(ord($ch)), 2, '0', STR_PAD_LEFT);
  39.      elseif (ord($ch) < 127)
  40.         $tableUtf[$ch] = $tableBin[$ch] = $ch;
  41.      else
  42.      {
  43.         $tableUtf[$ch] = $ch;
  44.         $tableBin[$ch] = '\\x' . dechex(ord($ch));
  45.      }
  46.       }
  47.       $tableBin["\\"] = '\\\\';
  48.       $tableBin["\r"] = '\\r';
  49.       $tableBin["\n"] = '\\n';
  50.       $tableBin["\t"] = '\\t';
  51.       $tableUtf['\\x'] = $tableBin['\\x'] = '\\\\x';
  52.    }
  53.  
  54.    if (is_bool($var))
  55.    {
  56.       return ($var ? 'TRUE' : 'FALSE') . "\n";
  57.    }
  58.    elseif ($var === NULL)
  59.    {
  60.       return "NULL\n";
  61.    }
  62.    elseif (is_int($var))
  63.    {
  64.       return "$var\n";
  65.    }
  66.    elseif (is_float($var))
  67.    {
  68.       $var = (string) $var;
  69.       if (strpos($var, '.') === FALSE)
  70.      $var .= '.0';
  71.       return "$var\n";
  72.    } elseif (is_string($var))
  73.    {
  74.       if ($maxLen && strlen($var) > $maxLen)
  75.       {
  76.      $s = htmlSpecialChars(substr($var, 0, $maxLen), ENT_NOQUOTES) . ' ... ';
  77.       }
  78.       else
  79.       {
  80.      $s = htmlSpecialChars($var, ENT_NOQUOTES);
  81.       }
  82.       $s = strtr($s, preg_match($reBinary, $s) || preg_last_error() ? $tableBin : $tableUtf);
  83.       $len = strlen($var);
  84.       return "\"$s\"" . ($len > 1 ? " ($len)" : "") . "\n";
  85.    }
  86.    elseif (is_array($var))
  87.    {
  88.       $s = "<span>array</span>(" . count($var) . ") ";
  89.       $space = str_repeat($space1 = '   ', $level);
  90.       $brackets = range(0, count($var) - 1) === array_keys($var) ? "[]" : "{}";
  91.  
  92.       static $marker;
  93.       if ($marker === NULL)
  94.      $marker = uniqid("\x00", TRUE);
  95.       if (empty($var))
  96.       {
  97.  
  98.       }
  99.       elseif (isset($var[$marker]))
  100.       {
  101.      $brackets = $var[$marker];
  102.      $s .= "$brackets[0] *RECURSION* $brackets[1]";
  103.       }
  104.       elseif ($level < $maxDepth || !$maxDepth)
  105.       {
  106.      $s .= "<code>$brackets[0]\n";
  107.      $var[$marker] = $brackets;
  108.      foreach ($var as $k => &$v)
  109.      {
  110.         if ($k === $marker)
  111.            continue;
  112.         $k = is_int($k) ? $k : '"' . strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf) . '"';
  113.         $s .= "$space$space1$k => " . _dump($v, $level + 1);
  114.      }
  115.      unset($var[$marker]);
  116.      $s .= "$space$brackets[1]</code>";
  117.       } else
  118.       {
  119.      $s .= "$brackets[0] ... $brackets[1]";
  120.       }
  121.       return $s . "\n";
  122.    }
  123.    elseif (is_object($var))
  124.    {
  125.       $arr = (array) $var;
  126.       $s = "<span>" . get_class($var) . "</span>(" . count($arr) . ") ";
  127.       $space = str_repeat($space1 = '   ', $level);
  128.  
  129.       static $list = array();
  130.       if (empty($arr))
  131.       {
  132.  
  133.       }
  134.       elseif (in_array($var, $list, TRUE))
  135.       {
  136.      $s .= "{ *RECURSION* }";
  137.       }
  138.       elseif ($level < $maxDepth || !$maxDepth)
  139.       {
  140.      $s .= "<code>{\n";
  141.      $list[] = $var;
  142.      foreach ($arr as $k => &$v)
  143.      {
  144.         $m = '';
  145.         if ($k[0] === "\x00")
  146.         {
  147.            $m = $k[1] === '*' ? ' <span>protected</span>' : ' <span>private</span>';
  148.            $k = substr($k, strrpos($k, "\x00") + 1);
  149.         }
  150.         $k = strtr($k, preg_match($reBinary, $k) || preg_last_error() ? $tableBin : $tableUtf);
  151.         $s .= "$space$space1\"$k\"$m => " . _dump($v, $level + 1);
  152.      }
  153.      array_pop($list);
  154.      $s .= "$space}</code>";
  155.       }
  156.       else
  157.       {
  158.      $s .= "{ ... }";
  159.       }
  160.       return $s . "\n";
  161.    }
  162.    elseif (is_resource($var))
  163.    {
  164.       return "<span>" . get_resource_type($var) . " resource</span>\n";
  165.    }
  166.    else
  167.    {
  168.       return "<span>unknown type</span>\n";
  169.    }
  170. }
Add Comment
Please, Sign In to add comment