Alexander Makarov
13 years ago
1 changed files with 144 additions and 0 deletions
@ -0,0 +1,144 @@
|
||||
<?php |
||||
/** |
||||
* VarDumper class file. |
||||
* |
||||
* @author Qiang Xue <qiang.xue@gmail.com> |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright © 2008-2011 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\util; |
||||
|
||||
/** |
||||
* VarDumper is intended to replace the buggy PHP function var_dump and print_r. |
||||
* It can correctly identify the recursively referenced objects in a complex |
||||
* object structure. It also has a recursive depth control to avoid indefinite |
||||
* recursive display of some peculiar variables. |
||||
* |
||||
* VarDumper can be used as follows, |
||||
* <pre> |
||||
* VarDumper::dump($var); |
||||
* </pre> |
||||
* |
||||
* @author Qiang Xue <qiang.xue@gmail.com> |
||||
* @since 2.0 |
||||
*/ |
||||
class VarDumper |
||||
{ |
||||
private static $_objects; |
||||
private static $_output; |
||||
private static $_depth; |
||||
|
||||
/** |
||||
* Displays a variable. |
||||
* This method achieves the similar functionality as var_dump and print_r |
||||
* but is more robust when handling complex objects such as Yii controllers. |
||||
* @param mixed $var variable to be dumped |
||||
* @param integer $depth maximum depth that the dumper should go into the variable. Defaults to 10. |
||||
* @param boolean $highlight whether the result should be syntax-highlighted |
||||
*/ |
||||
public static function dump($var,$depth=10,$highlight=false) |
||||
{ |
||||
echo self::dumpAsString($var,$depth,$highlight); |
||||
} |
||||
|
||||
/** |
||||
* Dumps a variable in terms of a string. |
||||
* This method achieves the similar functionality as var_dump and print_r |
||||
* but is more robust when handling complex objects such as Yii controllers. |
||||
* @param mixed $var variable to be dumped |
||||
* @param integer $depth maximum depth that the dumper should go into the variable. Defaults to 10. |
||||
* @param boolean $highlight whether the result should be syntax-highlighted |
||||
* @return string the string representation of the variable |
||||
*/ |
||||
public static function dumpAsString($var,$depth=10,$highlight=false) |
||||
{ |
||||
self::$_output=''; |
||||
self::$_objects=array(); |
||||
self::$_depth=$depth; |
||||
self::dumpInternal($var,0); |
||||
if($highlight) |
||||
{ |
||||
$result=highlight_string("<?php\n".self::$_output,true);
|
||||
self::$_output=preg_replace('/<\\?php<br \\/>/','',$result,1); |
||||
} |
||||
return self::$_output; |
||||
} |
||||
|
||||
/* |
||||
* @param mixed $var variable to be dumped |
||||
* @param integer $level depth level |
||||
*/ |
||||
private static function dumpInternal($var,$level) |
||||
{ |
||||
switch(gettype($var)) |
||||
{ |
||||
case 'boolean': |
||||
self::$_output.=$var?'true':'false'; |
||||
break; |
||||
case 'integer': |
||||
self::$_output.="$var"; |
||||
break; |
||||
case 'double': |
||||
self::$_output.="$var"; |
||||
break; |
||||
case 'string': |
||||
self::$_output.="'".addslashes($var)."'"; |
||||
break; |
||||
case 'resource': |
||||
self::$_output.='{resource}'; |
||||
break; |
||||
case 'NULL': |
||||
self::$_output.="null"; |
||||
break; |
||||
case 'unknown type': |
||||
self::$_output.='{unknown}'; |
||||
break; |
||||
case 'array': |
||||
if(self::$_depth<=$level) |
||||
self::$_output.='array(...)'; |
||||
else if(empty($var)) |
||||
self::$_output.='array()'; |
||||
else |
||||
{ |
||||
$keys=array_keys($var); |
||||
$spaces=str_repeat(' ',$level*4); |
||||
self::$_output.="array\n".$spaces.'('; |
||||
foreach($keys as $key) |
||||
{ |
||||
if(gettype($key)=='integer') |
||||
$key2=$key; |
||||
else |
||||
$key2="'".str_replace("'","\\'",$key)."'"; |
||||
|
||||
self::$_output.="\n".$spaces." $key2 => "; |
||||
self::$_output.=self::dumpInternal($var[$key],$level+1); |
||||
} |
||||
self::$_output.="\n".$spaces.')'; |
||||
} |
||||
break; |
||||
case 'object': |
||||
if(($id=array_search($var,self::$_objects,true))!==false) |
||||
self::$_output.=get_class($var).'#'.($id+1).'(...)'; |
||||
else if(self::$_depth<=$level) |
||||
self::$_output.=get_class($var).'(...)'; |
||||
else |
||||
{ |
||||
$id=array_push(self::$_objects,$var); |
||||
$className=get_class($var); |
||||
$members=(array)$var; |
||||
$spaces=str_repeat(' ',$level*4); |
||||
self::$_output.="$className#$id\n".$spaces.'('; |
||||
foreach($members as $key=>$value) |
||||
{ |
||||
$keyDisplay=strtr(trim($key),array("\0"=>':')); |
||||
self::$_output.="\n".$spaces." [$keyDisplay] => "; |
||||
self::$_output.=self::dumpInternal($value,$level+1); |
||||
} |
||||
self::$_output.="\n".$spaces.')'; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue