| 1 | <?php
|
|---|
| 2 | /**
|
|---|
| 3 | * TVarDumper class file
|
|---|
| 4 | *
|
|---|
| 5 | * @author Qiang Xue <qiang.xue@gmail.com>
|
|---|
| 6 | * @link http://www.pradosoft.com/
|
|---|
| 7 | * @copyright Copyright © 2005-2008 PradoSoft
|
|---|
| 8 | * @license http://www.pradosoft.com/license/
|
|---|
| 9 | * @version $Id$
|
|---|
| 10 | * @package System.Util
|
|---|
| 11 | */
|
|---|
| 12 |
|
|---|
| 13 | /**
|
|---|
| 14 | * TVarDumper class.
|
|---|
| 15 | *
|
|---|
| 16 | * TVarDumper is intended to replace the buggy PHP function var_dump and print_r.
|
|---|
| 17 | * It can correctly identify the recursively referenced objects in a complex
|
|---|
| 18 | * object structure. It also has a recursive depth control to avoid indefinite
|
|---|
| 19 | * recursive display of some peculiar variables.
|
|---|
| 20 | *
|
|---|
| 21 | * TVarDumper can be used as follows,
|
|---|
| 22 | * <code>
|
|---|
| 23 | * echo TVarDumper::dump($var);
|
|---|
| 24 | * </code>
|
|---|
| 25 | *
|
|---|
| 26 | * @author Qiang Xue <qiang.xue@gmail.com>
|
|---|
| 27 | * @version $Id$
|
|---|
| 28 | * @package System.Util
|
|---|
| 29 | * @since 3.0
|
|---|
| 30 | */
|
|---|
| 31 | class TVarDumper
|
|---|
| 32 | {
|
|---|
| 33 | private static $_objects;
|
|---|
| 34 | private static $_output;
|
|---|
| 35 | private static $_depth;
|
|---|
| 36 |
|
|---|
| 37 | /**
|
|---|
| 38 | * Converts a variable into a string representation.
|
|---|
| 39 | * This method achieves the similar functionality as var_dump and print_r
|
|---|
| 40 | * but is more robust when handling complex objects such as PRADO controls.
|
|---|
| 41 | * @param mixed variable to be dumped
|
|---|
| 42 | * @param integer maximum depth that the dumper should go into the variable. Defaults to 10.
|
|---|
| 43 | * @return string the string representation of the variable
|
|---|
| 44 | */
|
|---|
| 45 | public static function dump($var,$depth=10,$highlight=false)
|
|---|
| 46 | {
|
|---|
| 47 | self::$_output='';
|
|---|
| 48 | self::$_objects=array();
|
|---|
| 49 | self::$_depth=$depth;
|
|---|
| 50 | self::dumpInternal($var,0);
|
|---|
| 51 | if ($highlight)
|
|---|
| 52 | {
|
|---|
| 53 | $result=highlight_string("<?php\n".self::$_output,true);
|
|---|
| 54 | return preg_replace('/<\\?php<br \\/>/','',$result,1);
|
|---|
| 55 | }
|
|---|
| 56 | else
|
|---|
| 57 | return self::$_output;
|
|---|
| 58 | }
|
|---|
| 59 |
|
|---|
| 60 | private static function dumpInternal($var,$level)
|
|---|
| 61 | {
|
|---|
| 62 | switch (gettype($var))
|
|---|
| 63 | {
|
|---|
| 64 | case 'boolean':
|
|---|
| 65 | self::$_output.=$var?'true':'false';
|
|---|
| 66 | break;
|
|---|
| 67 | case 'integer':
|
|---|
| 68 | self::$_output.="$var";
|
|---|
| 69 | break;
|
|---|
| 70 | case 'double':
|
|---|
| 71 | self::$_output.="$var";
|
|---|
| 72 | break;
|
|---|
| 73 | case 'string':
|
|---|
| 74 | self::$_output.="'$var'";
|
|---|
| 75 | break;
|
|---|
| 76 | case 'resource':
|
|---|
| 77 | self::$_output.='{resource}';
|
|---|
| 78 | break;
|
|---|
| 79 | case 'NULL':
|
|---|
| 80 | self::$_output.="null";
|
|---|
| 81 | break;
|
|---|
| 82 | case 'unknown type':
|
|---|
| 83 | self::$_output.='{unknown}';
|
|---|
| 84 | break;
|
|---|
| 85 | case 'array':
|
|---|
| 86 | if (self::$_depth<=$level)
|
|---|
| 87 | self::$_output.='array(...)';
|
|---|
| 88 | else if (empty($var))
|
|---|
| 89 | self::$_output.='array()';
|
|---|
| 90 | else
|
|---|
| 91 | {
|
|---|
| 92 | $keys=array_keys($var);
|
|---|
| 93 | $spaces=str_repeat(' ',$level*4);
|
|---|
| 94 | self::$_output.="array\n".$spaces.'(';
|
|---|
| 95 | foreach ($keys as $key)
|
|---|
| 96 | {
|
|---|
| 97 | self::$_output.="\n".$spaces." [$key] => ";
|
|---|
| 98 | self::$_output.=self::dumpInternal($var[$key],$level+1);
|
|---|
| 99 | }
|
|---|
| 100 | self::$_output.="\n".$spaces.')';
|
|---|
| 101 | }
|
|---|
| 102 | break;
|
|---|
| 103 | case 'object':
|
|---|
| 104 | if (($id=array_search($var,self::$_objects,true))!==false)
|
|---|
| 105 | self::$_output.=get_class($var).'#'.($id+1).'(...)';
|
|---|
| 106 | else if (self::$_depth<=$level)
|
|---|
| 107 | self::$_output.=get_class($var).'(...)';
|
|---|
| 108 | else
|
|---|
| 109 | {
|
|---|
| 110 | $id=array_push(self::$_objects,$var);
|
|---|
| 111 | $className=get_class($var);
|
|---|
| 112 | $members=(array)$var;
|
|---|
| 113 | $keys=array_keys($members);
|
|---|
| 114 | $spaces=str_repeat(' ',$level*4);
|
|---|
| 115 | self::$_output.="$className#$id\n".$spaces.'(';
|
|---|
| 116 | foreach ($keys as $key)
|
|---|
| 117 | {
|
|---|
| 118 | $keyDisplay=strtr(trim($key),array("\0"=>':'));
|
|---|
| 119 | self::$_output.="\n".$spaces." [$keyDisplay] => ";
|
|---|
| 120 | self::$_output.=self::dumpInternal($members[$key],$level+1);
|
|---|
| 121 | }
|
|---|
| 122 | self::$_output.="\n".$spaces.')';
|
|---|
| 123 | }
|
|---|
| 124 | break;
|
|---|
| 125 | }
|
|---|
| 126 | }
|
|---|
| 127 | }
|
|---|