You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							144 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
	
	
							144 lines
						
					
					
						
							4.0 KiB
						
					
					
				<?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; | 
						|
		} | 
						|
	} | 
						|
} |