* @link http://www.yiiframework.com/ * @copyright 2008-2013 Yii Software LLC * @license http://www.yiiframework.com/license/ */ /** * CVarDumper 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. * * CVarDumper can be used as follows, *
 * CVarDumper::dump($var);
 * 
* * @author Qiang Xue * @package system.utils * @since 1.0 */ class CVarDumper { 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("/','',$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(...)'; elseif(empty($var)) self::$_output.='array()'; else { $keys=array_keys($var); $spaces=str_repeat(' ',$level*4); self::$_output.="array\n".$spaces.'('; foreach($keys as $key) { self::$_output.="\n".$spaces.' '; self::dumpInternal($key,0); 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).'(...)'; elseif(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; } } }