Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2006 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 3.0 of the PHP license, |// | that is bundled with this package in the file LICENSE, and is |// | available through the world-wide-web at the following url: |// | http://www.php.net/license/3_0.txt. |// | If you did not receive a copy of the PHP license and are unable to |// | obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Authors: Frederic Poeydomenge <fpoeydomenge@free.fr> |// +----------------------------------------------------------------------+/*** Wrapper for the var_dump function.** " The var_dump function displays structured information about expressions* that includes its type and value. Arrays are explored recursively* with values indented to show structure. "** The Var_Dump class captures the output of the var_dump function,* by using output control functions, and then uses external renderer* classes for displaying the result in various graphical ways :* simple text, HTML/XHTML text, HTML/XHTML table, XML, ...** @category PHP* @package Var_Dump* @author Frederic Poeydomenge <fpoeydomenge@free.fr>* @copyright 1997-2006 The PHP Group* @license http://www.php.net/license/3_0.txt PHP License 3.0* @version CVS: $Id: Var_Dump.php 237750 2007-06-15 08:06:25Z fredericpoeydome $* @link http://pear.php.net/package/Var_Dump*//*** Include Renderer class*/require_once 'Var_Dump/Renderer.php';/*** Constants*/define ('VAR_DUMP_START_GROUP', 1);define ('VAR_DUMP_FINISH_GROUP', 2);define ('VAR_DUMP_START_ELEMENT_NUM', 3);define ('VAR_DUMP_START_ELEMENT_STR', 4);define ('VAR_DUMP_FINISH_ELEMENT', 5);define ('VAR_DUMP_FINISH_STRING', 6);define ('VAR_DUMP_PREG_MATCH', 0);define ('VAR_DUMP_PREG_SPACES', 1);define ('VAR_DUMP_PREG_KEY_QUOTE', 2);define ('VAR_DUMP_PREG_KEY', 3);define ('VAR_DUMP_PREG_STRING_TYPE', 4);define ('VAR_DUMP_PREG_STRING_LENGTH', 5);define ('VAR_DUMP_PREG_STRING_VALUE', 6);define ('VAR_DUMP_PREG_VALUE', 7);define ('VAR_DUMP_PREG_VALUE_REFERENCE', 8);define ('VAR_DUMP_PREG_VALUE_TYPE', 9);define ('VAR_DUMP_PREG_VALUE_COMPL', 10);define ('VAR_DUMP_PREG_VALUE_RESOURCE', 11);define ('VAR_DUMP_PREG_ARRAY_END', 12);define ('VAR_DUMP_PREG_ARRAY_START', 13);define ('VAR_DUMP_PREG_ARRAY_TYPE', 14);define ('VAR_DUMP_PREG_ARRAY_COUNT', 15);define ('VAR_DUMP_PREG_STRING_COMPL', 16);/*** Main class.** @category PHP* @package Var_Dump* @author Frederic Poeydomenge <fpoeydomenge@free.fr>* @copyright 1997-2006 The PHP Group* @license http://www.php.net/license/3_0.txt PHP License 3.0* @version CVS: $Id: Var_Dump.php 237750 2007-06-15 08:06:25Z fredericpoeydome $* @link http://pear.php.net/package/Var_Dump*/class Var_Dump{/*** Default configuration options.** @var array* @access public*/var $defaultOptions = array('display_mode' => 'XHTML_Text', // Display mode.'ignore_list' => NULL // List of ignored class names.);/*** Run-time configuration options.** @var array* @access public*/var $options = array();/*** Rendering object.** @var object* @access public*/var $renderer = NULL;/*** Rendering configuration options.** See Var_Dump/Renderer/*.php for the complete list of options** @var array* @access public*/var $rendererOptions = array();/*** Class constructor.** The factory approach must be used in relationship with the* toString() method.* See Var_Dump/Renderer/*.php for the complete list of options** @see Var_Dump::toString()* @param mixed $options String (display mode) or array (Global parameters).* @param array $rendererOptions Parameters for the rendering.* @access public*/function Var_Dump($options = array(), $rendererOptions = array()){if (! is_null($options)) {if (is_string($options)) {$options = array('display_mode' => $options);}$this->options = array_merge ($this->defaultOptions,$options);}if (! is_null($rendererOptions) and is_array($rendererOptions)) {$this->rendererOptions = $rendererOptions;$this->renderer = & Var_Dump_Renderer::factory($this->options['display_mode'],$this->rendererOptions);}}/*** Attempt to return a concrete Var_Dump instance.** The factory approach must be used in relationship with the* toString() method.* See Var_Dump/Renderer/*.php for the complete list of options** @see Var_Dump::toString()* @param mixed $options String (display mode) or array (Global parameters).* @param array $rendererOptions Parameters for the rendering.* @access public*/function & factory($options = array(), $rendererOptions = array()){$obj = new Var_Dump($options, $rendererOptions);return $obj;}/*** Uses a renderer object to return the string representation of a variable.** @param mixed $expression The variable to parse.* @return string The string representation of the variable.* @access public*/function toString($expression){if (is_null($this->renderer)) {return '';}$family = array(); // element family$depth = array(); // element depth$type = array(); // element type$value = array(); // element value// When xdebug is loaded, disable the custom fancy var_dump() function,// that is not compatible with the regexp parsing below, by forcing// the "html_errors" configuration option to "off"if (extension_loaded('xdebug')) {ini_set('html_errors', '0');}// Captures the output of the var_dump function,// by using output control functions.ob_start();var_dump($expression);$variable = ob_get_contents();ob_end_clean();// When xdebug is loaded, restore the value of the// "html_errors" configuration optionif (extension_loaded('xdebug')) {ini_restore('html_errors');}// Regexp that parses the output of the var_dump function.// The numbers between square brackets [] are the reference// of the captured subpattern, and correspond to the entries// in the resulting $matches array.preg_match_all('!^(\s*) # 2 spaces for each depth level(?: #(?:\[("?)(.*?)\\2\]=>) # Key [2-3]| # or(?:(&?string\((\d+)\))\s+"(.*)) # String [4-6]| # or( # Value [7-11](&?) # - reference [8](bool|int|float|resource| # - type [9]NULL|\*RECURSION\*|UNKNOWN:0) #(?:\((.*?)\))? # - complement [10](?:\sof\stype\s\((.*?)\))? # - resource [11]) #| # or(}) # End of array/object [12]| # or(?:(&?(array|object)\((.+)\).*)\ {) # Start of array/object [13-15]| # or(.*) # String (additional lines) [16]) #$!Smx',$variable,$matches,PREG_SET_ORDER);// Used to keep the maxLen of the keys for each nested variable.$stackLen = array();$keyLen = array();$maxLen = 0;// Used when matching a string, to count the remaining// number of chars before the end of the string.$countdown = 0;// Loop through the matches of the previously defined regexp.reset($matches);while (list($key, $match) = each($matches)) {$count = count($match) - 1;// Find which alternative has been matched in the regexp,// by looking at the number of elements in the $match array.switch ($count) {// Key//=====// - Compute the maxLen of the keys at the actual depthcase VAR_DUMP_PREG_KEY:$len = strlen($match[VAR_DUMP_PREG_KEY]);if ($len > $maxLen) {$maxLen = $len;}if (empty($match[VAR_DUMP_PREG_KEY_QUOTE])) {$family[] = VAR_DUMP_START_ELEMENT_NUM;} else {$family[] = VAR_DUMP_START_ELEMENT_STR;}$depth[] = strlen($match[VAR_DUMP_PREG_SPACES]) >> 1;$type[] = NULL;$value[] = $match[VAR_DUMP_PREG_KEY];break;// String//========// - Set the countdown (remaining number of chars before eol) =// len of the string - matched len + 1 (final ")case VAR_DUMP_PREG_STRING_TYPE:case VAR_DUMP_PREG_STRING_LENGTH:case VAR_DUMP_PREG_STRING_VALUE:$countdown =$match[VAR_DUMP_PREG_STRING_LENGTH]- strlen($match[VAR_DUMP_PREG_STRING_VALUE])+ 1;$family[] = VAR_DUMP_FINISH_STRING;$depth[] = strlen($match[VAR_DUMP_PREG_SPACES]) >> 1;$type[] = $match[VAR_DUMP_PREG_STRING_TYPE];if ($countdown == 0) {$value[] = substr($match[VAR_DUMP_PREG_STRING_VALUE], 0, -1);} else {$value[] = $match[VAR_DUMP_PREG_STRING_VALUE];}break;// String (additional lines)//===========================// - Compute new countdown value// - Pop value off the end of the array, and concatenate new value// - Last additional line : remove trailing "// - Push new value onto the end of arraycase VAR_DUMP_PREG_STRING_COMPL:if ($countdown > 0) {$countdown -= strlen($match[VAR_DUMP_PREG_MATCH]) + 1;$new_value =array_pop($value) . "\n" .$match[VAR_DUMP_PREG_STRING_COMPL];if ($countdown == 0) {$new_value = substr($new_value, 0, -1);}array_push($value, $new_value);}break;// Value//=======case VAR_DUMP_PREG_VALUE:case VAR_DUMP_PREG_VALUE_REFERENCE:case VAR_DUMP_PREG_VALUE_TYPE:case VAR_DUMP_PREG_VALUE_COMPL:case VAR_DUMP_PREG_VALUE_RESOURCE:$family[] = VAR_DUMP_FINISH_ELEMENT;$depth[] = strlen($match[VAR_DUMP_PREG_SPACES]) >> 1;switch ($match[VAR_DUMP_PREG_VALUE_TYPE]) {case 'bool':case 'int':case 'float':$type[] =$match[VAR_DUMP_PREG_VALUE_REFERENCE] .$match[VAR_DUMP_PREG_VALUE_TYPE];$value[] = $match[VAR_DUMP_PREG_VALUE_COMPL];break;case 'resource':$type[] =$match[VAR_DUMP_PREG_VALUE_REFERENCE] .$match[VAR_DUMP_PREG_VALUE_TYPE] .'(' . $match[VAR_DUMP_PREG_VALUE_RESOURCE] . ')';$value[] = $match[VAR_DUMP_PREG_VALUE_COMPL];break;default:$type[] =$match[VAR_DUMP_PREG_VALUE_REFERENCE] .$match[VAR_DUMP_PREG_VALUE_TYPE];$value[] = NULL;break;}break;// String (additional line containing a single "}")//==================================================// - see "case VAR_DUMP_PREG_STRING_COMPL" just above//// OR End of array/object//========================// - Pop the maxLen of the keys off the end of the stack// - If the last element on the stack is an array(0) or object(0),// replace it by a standard elementcase VAR_DUMP_PREG_ARRAY_END:if ($countdown > 0) {// String$countdown -= strlen($match[VAR_DUMP_PREG_MATCH]) + 1;$new_value = array_pop($value) . "\n" . '}';if ($countdown == 0) {$new_value = substr($new_value, 0, -1);}array_push($value, $new_value);} else {// End of array/object$oldLen = array_pop($stackLen);$keyLen[$oldLen[0]] = $maxLen;$maxLen = $oldLen[1];if (($family[count($family) - 1] == VAR_DUMP_START_GROUP)and($type[count($type) - 1] === 0)) {$family[count($family) - 1] = VAR_DUMP_FINISH_ELEMENT;$type[count($type) - 1] = $value[count($value) - 1];$value[count($value) - 1] = NULL;} else {$family[] = VAR_DUMP_FINISH_GROUP;$depth[] = strlen($match[VAR_DUMP_PREG_SPACES]) >> 1;$type[] = NULL;$value[] = $match[VAR_DUMP_PREG_ARRAY_END];}}break;// Start of array/object//=======================// - If object is in the "ignore_list", jump at the end of it// - Else process it normally :// - Push the maxLen of the keys onto the end of the stack// - Initialize new maxLen to 0case VAR_DUMP_PREG_ARRAY_START:case VAR_DUMP_PREG_ARRAY_TYPE:case VAR_DUMP_PREG_ARRAY_COUNT:$parse = TRUE;// If object is in the "ignore_list", jump at the end of it.if ($match[VAR_DUMP_PREG_ARRAY_TYPE] == 'object') {$infos = $match[VAR_DUMP_PREG_ARRAY_COUNT];$class_name = substr($infos, 0, strpos($infos, ')'));if (! is_null($this->options['ignore_list'])andin_array($class_name, $this->options['ignore_list'])) {$family[] = VAR_DUMP_FINISH_STRING;$depth[] = strlen($match[VAR_DUMP_PREG_SPACES]) >> 1;$type[] = 'object(' . $class_name . ')';$value[] = 'Not parsed.';while ($parse) {list($dummy, $each) = each($matches);if ($match[VAR_DUMP_PREG_SPACES] == $each[VAR_DUMP_PREG_SPACES]and(count($each) - 1) == VAR_DUMP_PREG_ARRAY_END) {$parse = FALSE;}};}}// If not, process it normally.if ($parse) {array_push($stackLen, array(count($family), $maxLen));$maxLen = 0;$family[] = VAR_DUMP_START_GROUP;$depth[] = strlen($match[VAR_DUMP_PREG_SPACES]) >> 1;$type[] = (int) $match[VAR_DUMP_PREG_ARRAY_COUNT];$value[] = $match[VAR_DUMP_PREG_ARRAY_START];}break;}}$this->renderer->initialize($family, $depth, $type, $value, $keyLen);return $this->renderer->toString();}/*** Attempt to return a concrete singleton Var_Dump instance.** The singleton approach must be used in relationship with the* displayInit() and display() methods.* See Var_Dump/Renderer/*.php for the complete list of options** @see Var_Dump::display(), Var_Dump::displayInit()* @return object Var_Dump instance* @access public*/function & singleton(){static $instance;if (! isset($instance)) {$instance = new Var_Dump(array(), array(), array());}return $instance;}/*** Initialise the singleton object used by the display() method.** @see Var_Dump::singleton(), Var_Dump::display()* @param mixed $options String (display mode) or array (Global parameters).* @param array $rendererOptions Parameters for the rendering.* @access public*/function displayInit($options = array(), $rendererOptions = array()){$displayInit = & Var_Dump::singleton();$displayInit->Var_Dump($options, $rendererOptions);}/*** Outputs or returns a string representation of a variable.** @see Var_Dump::singleton(), Var_Dump::displayInit()* @param mixed $expression The variable to parse.* @param bool $return Whether the variable should be echoed or returned.* @param mixed $options String (display mode) or array (Global parameters).* @param array $rendererOptions Parameters for the rendering.* @return string If returned, the string representation of the variable.* @access public*/function display($expression, $return = FALSE, $options = NULL, $rendererOptions = NULL){$display = & Var_Dump::singleton();if (! is_null($options) or ! is_null($rendererOptions)) {if (is_null($rendererOptions)) {$rendererOptions = array();}$display->Var_Dump($options, $rendererOptions);}if ($return === TRUE) {return $display->toString($expression);} else {echo $display->toString($expression);}}}?>