var_dump

(PHP 3 >= 3.0.5, PHP 4, PHP 5)

var_dump -- 打印变量的相关信息

描述

void var_dump ( mixed expression [, mixed expression [, ...]] )

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

提示: 为了防止程序直接将结果输出到浏览器,可以使用输出控制函数来捕获此函数的输出,并把它们保存到一个例如 string 类型的变量中。

可以比较一下 var_dump()print_r()

例子 1. var_dump() 示例

<pre>
<?php
$a
= array (1, 2, array ("a", "b", "c"));
var_dump ($a);

/* 输出:
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

*/

$b = 3.1;
$c = TRUE;
var_dump($b,$c);

/* 输出:
float(3.1)
bool(true)

*/
?>
</pre>


add a note add a note User Contributed Notes
BigueNique at yahoo dot ca
03-Nov-2006 12:33
Geez! That was a hard one!

Wanted a more 'elegant' way do dump variable contents, but soon discovered the 'PHP reference problem', which makes it hard to deal recursive occurence of the same variable.

The only way I found to detect recursion was to actually modify the variable content (passed by reference) in order to be able to know that it was actually parsed.

References in PHP are quite confusing and often PHP got some strange behaviors....

TIP: don't use FOREACH($array as $key->$value) with arrays containing references...  You'll get the values the references had at the time they were put in the array, not their actual values.  You have to do $value=&$a['key']; (notice the amp) otherwise you're screwed!

Enjoy!

<?php
// An elegant dump
// By BigueNique@yahoo.ca
$elegant_dump_indent = '|&nbsp;&nbsp;&nbsp;&nbsp';
function
elegant_dump(&$var, $var_name='', $indent='', $reference='') {
   global
$elegant_dump_indent;
  
$reference=$reference.$var_name;

  
// first check if the variable has already been parsed
  
$keyvar = 'the_elegant_dump_recursion_protection_scheme';
  
$keyname = 'referenced_object_name';
   if (
is_array($var) && isset($var[$keyvar])) {
      
// the passed variable is already being parsed!
      
$real_var=&$var[$keyvar];
      
$real_name=&$var[$keyname];
      
$type=gettype($real_var);
       echo
"$indent<b>$var_name</b> (<i>$type</i>) = <font color=\"red\">&amp;$real_name</font><br>".br;
   } else {

      
// we will insert an elegant parser-stopper
      
$var=array($keyvar=>$var,
                  
$keyname=>$reference);
      
$avar=&$var[$keyvar];

      
// do the display
      
$type=gettype($avar);
      
// array?
        
if (is_array($avar)) {
          
$count=count($avar);
           echo
"$indent<b>$var_name</b> (<i>$type($count)</i>) {<br>".br;
          
$keys=array_keys($avar);
           foreach(
$keys as $name) {
              
$value=&$avar[$name];
              
elegant_dump($value, "['$name']", $indent.$elegant_dump_indent, $reference);
           }
           echo
"$indent}<br>".br;
       } else
      
// object?
        
if (is_object($avar)) {
           echo
"$indent<b>$var_name</b> (<i>$type</i>) {<br>".br;
           foreach(
$avar as $name=>$value) elegant_dump($value, "-&gt;$name", $indent.$elegant_dump_indent, $reference);
           echo
"$indent}<br>".br;
       } else
      
// string?
      
if (is_string($avar)) echo "$indent<b>$var_name</b> (<i>$type</i>) = \"$avar\"<br>".br;
      
// any other?
      
else echo "$indent<b>$var_name</b> (<i>$type</i>) = $avar<br>".br;

      
$var=$var[$keyvar];
   }
}

$a=array();
$b['refers to a']=&$a;
$c['refers to b']=&$b;
$a['refers to c']=&$c;
elegant_dump($a,'$a');

/* Outputs:

$a (array(1)) {
|    ['refers to c'] (array(1)) {
|    |    ['refers to b'] (array(1)) {
|    |    |    ['refers to a'] (array) = &$a <-- stops recursing there
|    |    }
|    }
}

Works with objects too: */

$d->ref2f='';
$e->ref2d=&$d;
$f->ref2e=&$e;
$d->ref2f=&$f;
elegant_dump($d,'$d');

/* Outputs:

$d (object) {
|    ->ref2f (object) {
|    |    ->ref2e (object) {
|    |    |    ->ref2d (object) = &$d
|    |    }
|    }
}

*/
?>
jonbarnett at gmail dot com
03-Oct-2006 03:25
dumping objects that reference each other could lead to infinite recursion
<?php
$brother
= new Sibling();
$sister = new Sibling();
$brother->sister = $sister;
$sister->brother = $brother;

var_dump($brother);
/* dumps all of $brother's properties, including "sister", which dumps all of $sister's properties, including "brother", etc. */
?>
Storm
20-Aug-2006 01:12
ul_var_dump - dump $var to <ul><li></li></ul>

<?php

function ul_var_dump(&$var,$type=0)
{
   if(!
$type)
       echo
"<ul type='circle' style='border:1px solid #a0a0a0;padding-bottom:4px;padding-right:4px'>\n<li>";
   if(
is_array($var))
   {
       echo
"[array][".count($var)."]";
       echo
"<ul type='circle' style='border:1px solid #a0a0a0;padding-bottom:4px;padding-right:4px'>\n";
       foreach(
$var as $k=>$v)
       {
           echo
"<li>\"{$k}\"=>";
          
ul_var_dump(&$v,1);
       }
       echo
"</ul>\n";
   }
   else
       echo
"[".gettype($var)."][{$var}]</li>\n";
   if(!
$type)
       echo
"</ul>\n";
}

?>
andre at webkr dot de
05-Oct-2005 05:45
var_dump prefixes the variable type with & if the variable has more than one reference.
This is only true for variables that are part of an array, not for scalar types.

Example:
<?php
$a
['foo'] = 'other';
$a['bar'] = 'i_have_ref';
$b =& $a['bar'];

var_dump($a);
var_dump($b);
?>

Result:
array(2) {
 ["foo"]=>
  string(5) "other"
 ["bar"]=>
  &string(10) "i_have_ref"
}
string(10) "i_have_ref"
ospinto at hotmail dot com
07-Aug-2005 12:43
Just created this neat class that dumps a variable in a colored tabular structure similar to the cfdump tag in Coldfusion. Very easy to use and makes it so much easier to see the contents of variable. For examples and download, visit http://dbug.ospinto.com
edwardzyang at thewritingpot dot com
21-Mar-2005 06:06
If you're like me and uses var_dump whenever you're debugging, you might find these two "wrapper" functions helpful.

This one automatically adds the PRE tags around the var_dump output so you get nice formatted arrays.

<?php

function var_dump_pre($mixed = null) {
  echo
'<pre>';
 
var_dump($mixed);
  echo
'</pre>';
  return
null;
}

?>

This one returns the value of var_dump instead of outputting it.

<?php

function var_dump_ret($mixed = null) {
 
ob_start();
 
var_dump($mixed);
 
$content = ob_get_contents();
 
ob_end_clean();
  return
$content;
}

?>

Fairly simple functions, but they're infinitely helpful (I use var_dump_pre() almost exclusively now).
anon
28-Jan-2005 10:31
var_dump(get_defined_vars());
will dump all defined variables to the browser.