略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: var_dump

2024-11-14

var_dump

(PHP 4, PHP 5, PHP 7, PHP 8)

var_dump打印变量的相关信息

说明

var_dump(mixed $value, mixed ...$values): void

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

对象的所有公共、私有和受保护的属性都会在输出中返回,除非该对象实现了 __debugInfo() 方法。

小技巧

和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个 string 中。

参数

value

要打印的表达式。

values

更多要打印的表达式。

返回值

没有返回值。

范例

示例 #1 var_dump() 例子

<?php
$a 
= array(12, 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"
  }
}
<?php

$b 
3.1;
$c true;
var_dump($b$c);

?>

以上例程会输出:

float(3.1)
bool(true)

参见

add a noteadd a note

User Contributed Notes 16 notes

up
156
rich dot schu at gmail dot com
14 years ago
Keep in mind if you have xdebug installed it will limit the var_dump() output of array elements and object properties to 3 levels deep.

To change the default, edit your xdebug.ini file and add the folllowing line:
xdebug.var_display_max_depth=n

More information here:
http://www.xdebug.org/docs/display
up
109
edwardzyang at thewritingpot dot com
17 years ago
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).
up
33
b dot bergloev at gmail dot com
7 years ago
I post a new var_dump function with colors and collapse features. It can also adapt to terminal output if you execute it from there. No need to wrap it in a pre tag to get it to work in browsers.

<?php
function dump_debug($input, $collapse=false) {
   
$recursive = function($data, $level=0) use (&$recursive, $collapse) {
        global
$argv;

       
$isTerminal = isset($argv);

        if (!
$isTerminal && $level == 0 && !defined("DUMP_DEBUG_SCRIPT")) {
           
define("DUMP_DEBUG_SCRIPT", true);

            echo
'<script language="Javascript">function toggleDisplay(id) {';
            echo
'var state = document.getElementById("container"+id).style.display;';
            echo
'document.getElementById("container"+id).style.display = state == "inline" ? "none" : "inline";';
            echo
'document.getElementById("plus"+id).style.display = state == "inline" ? "inline" : "none";';
            echo
'}</script>'."\n";
        }

       
$type = !is_string($data) && is_callable($data) ? "Callable" : ucfirst(gettype($data));
       
$type_data = null;
       
$type_color = null;
       
$type_length = null;

        switch (
$type) {
            case
"String":
               
$type_color = "green";
               
$type_length = strlen($data);
               
$type_data = "\"" . htmlentities($data) . "\""; break;

            case
"Double":
            case
"Float":
               
$type = "Float";
               
$type_color = "#0099c5";
               
$type_length = strlen($data);
               
$type_data = htmlentities($data); break;

            case
"Integer":
               
$type_color = "red";
               
$type_length = strlen($data);
               
$type_data = htmlentities($data); break;

            case
"Boolean":
               
$type_color = "#92008d";
               
$type_length = strlen($data);
               
$type_data = $data ? "TRUE" : "FALSE"; break;

            case
"NULL":
               
$type_length = 0; break;

            case
"Array":
               
$type_length = count($data);
        }

        if (
in_array($type, array("Object", "Array"))) {
           
$notEmpty = false;

            foreach(
$data as $key => $value) {
                if (!
$notEmpty) {
                   
$notEmpty = true;

                    if (
$isTerminal) {
                        echo
$type . ($type_length !== null ? "(" . $type_length . ")" : "")."\n";

                    } else {
                       
$id = substr(md5(rand().":".$key.":".$level), 0, 8);

                        echo
"<a href=\"javascript:toggleDisplay('". $id ."');\" style=\"text-decoration:none\">";
                        echo
"<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>";
                        echo
"</a>";
                        echo
"<span id=\"plus". $id ."\" style=\"display: " . ($collapse ? "inline" : "none") . ";\">&nbsp;&#10549;</span>";
                        echo
"<div id=\"container". $id ."\" style=\"display: " . ($collapse ? "" : "inline") . ";\">";
                        echo
"<br />";
                    }

                    for (
$i=0; $i <= $level; $i++) {
                        echo
$isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                    }

                    echo
$isTerminal ? "\n" : "<br />";
                }

                for (
$i=0; $i <= $level; $i++) {
                    echo
$isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                }

                echo
$isTerminal ? "[" . $key . "] => " : "<span style='color:black'>[" . $key . "]&nbsp;=>&nbsp;</span>";

               
call_user_func($recursive, $value, $level+1);
            }

            if (
$notEmpty) {
                for (
$i=0; $i <= $level; $i++) {
                    echo
$isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                }

                if (!
$isTerminal) {
                    echo
"</div>";
                }

            } else {
                echo
$isTerminal ?
                       
$type . ($type_length !== null ? "(" . $type_length . ")" : "") . "  " :
                       
"<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>&nbsp;&nbsp;";
            }

        } else {
            echo
$isTerminal ?
                   
$type . ($type_length !== null ? "(" . $type_length . ")" : "") . "  " :
                   
"<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>&nbsp;&nbsp;";

            if (
$type_data != null) {
                echo
$isTerminal ? $type_data : "<span style='color:" . $type_color . "'>" . $type_data . "</span>";
            }
        }

        echo
$isTerminal ? "\n" : "<br />";
    };

   
call_user_func($recursive, $input);
}
?>
up
16
anon
17 years ago
var_dump(get_defined_vars());
will dump all defined variables to the browser.
up
8
thriller dot ze at gmail dot com
14 years ago
As Bryan said, it is possible to capture var_dump() output to a string. But it's not quite exact if the dumped variable contains HTML code.

You can use this instead:

<?php
echo '<pre>'; // This is for correct handling of newlines
ob_start();
var_dump($var);
$a=ob_get_contents();
ob_end_clean();
echo
htmlspecialchars($a,ENT_QUOTES); // Escape every HTML special chars (especially > and < )
echo '</pre>';
?>
up
6
kobrasrealm at gmail dot com
10 years ago
I wrote this dandy little function for using var_dump() on HTML documents so I don't have to view the source.

<?php
function htmldump($variable, $height="9em") {
echo
"<pre style=\"border: 1px solid #000; height: {$height}; overflow: auto; margin: 0.5em;\">";
var_dump($variable);
echo
"</pre>\n";
}
?>

You can pass arguments like this:
<?php
$sql
= mysql_query("SELECT id, name, value FROM table WHERE cond = 'value'");
$s = mysql_fetch_assoc($sql);

// Dump variable containing the result of the MySQL query
var_dump($s);
?>

The second parameter lets you specify the height of the box. Default is 9em, but if you're expecting a huge output you'll probably want a higher value.

<?php
var_dump
($s, "17em");
?>

Happy var_dumping.
up
3
Anonymous
5 years ago
Be careful this outputs to stdout stream (1) instead of the proper stderr stream (2).
up
3
stlawson *AT* joyfulearthtech *DOT* com
10 years ago
<?php
/**
* Better GI than print_r or var_dump -- but, unlike var_dump, you can only dump one variable. 
* Added htmlentities on the var content before echo, so you see what is really there, and not the mark-up.
*
* Also, now the output is encased within a div block that sets the background color, font style, and left-justifies it
* so it is not at the mercy of ambient styles.
*
* Inspired from:     PHP.net Contributions
* Stolen from:       [highstrike at gmail dot com]
* Modified by:       stlawson *AT* JoyfulEarthTech *DOT* com
*
* @param mixed $var  -- variable to dump
* @param string $var_name  -- name of variable (optional) -- displayed in printout making it easier to sort out what variable is what in a complex output
* @param string $indent -- used by internal recursive call (no known external value)
* @param unknown_type $reference -- used by internal recursive call (no known external value)
*/
function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
   
$do_dump_indent = "<span style='color:#666666;'>|</span> &nbsp;&nbsp; ";
   
$reference = $reference.$var_name;
   
$keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';
   
   
// So this is always visible and always left justified and readable
   
echo "<div style='text-align:left; background-color:white; font: 100% monospace; color:black;'>";

    if (
is_array($var) && isset($var[$keyvar]))
    {
       
$real_var = &$var[$keyvar];
       
$real_name = &$var[$keyname];
       
$type = ucfirst(gettype($real_var));
        echo
"$indent$var_name <span style='color:#666666'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
       
$var = array($keyvar => $var, $keyname => $reference);
       
$avar = &$var[$keyvar];

       
$type = ucfirst(gettype($avar));
        if(
$type == "String") $type_color = "<span style='color:green'>";
        elseif(
$type == "Integer") $type_color = "<span style='color:red'>";
        elseif(
$type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif(
$type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif(
$type == "NULL") $type_color = "<span style='color:black'>";

        if(
is_array($avar))
        {
           
$count = count($avar);
            echo
"$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#666666'>$type ($count)</span><br>$indent(<br>";
           
$keys = array_keys($avar);
            foreach(
$keys as $name)
            {
               
$value = &$avar[$name];
               
do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo
"$indent)<br>";
        }
        elseif(
is_object($avar))
        {
            echo
"$indent$var_name <span style='color:#666666'>$type</span><br>$indent(<br>";
            foreach(
$avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo
"$indent)<br>";
        }
        elseif(
is_int($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".htmlentities($avar)."</span><br>";
        elseif(
is_string($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color\"".htmlentities($avar)."\"</span><br>";
        elseif(
is_float($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".htmlentities($avar)."</span><br>";
        elseif(
is_bool($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(
is_null($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo
"$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> ".htmlentities($avar)."<br>";

       
$var = $var[$keyvar];
    }
   
    echo
"</div>";
}
?>
up
1
egorinsk at gmail com
13 years ago
Note that var_dump reset()'s array internal pointer!
up
1
php at mikeboers dot com
14 years ago
Howdy!

I am working on a pretty large project where I needed to dump a human readable form of whatever into the log files... and I thought var_export was too difficult to read. BigueNique at yahoo dot ca has a nice solution, although I needed to NOT modify whatever was being passed to dump.

So borrowing heavily from BigueNique's (just reworked his function) and someone's idea over in the object cloning page, I came up with the following function.

It makes a complete copy of whatever object you initially pass it, including all recursive definitions and outside objects references, then does the same thing as BigueNique's function. I also heavily reworked what it output, to suit my needs.

<?php

function var_log(&$varInput, $var_name='', $reference='', $method = '=', $sub = false) {

    static
$output ;
    static
$depth ;

    if (
$sub == false ) {
       
$output = '' ;
       
$depth = 0 ;
       
$reference = $var_name ;
       
$var = serialize( $varInput ) ;
       
$var = unserialize( $var ) ;
    } else {
        ++
$depth ;
       
$var =& $varInput ;
       
    }
       
   
// constants
   
$nl = "\n" ;
   
$block = 'a_big_recursion_protection_block';
   
   
$c = $depth ;
   
$indent = '' ;
    while(
$c -- > 0 ) {
       
$indent .= '|  ' ;
    }

   
// if this has been parsed before
   
if ( is_array($var) && isset($var[$block])) {
   
       
$real =& $var[ $block ] ;
       
$name =& $var[ 'name' ] ;
       
$type = gettype( $real ) ;
       
$output .= $indent.$var_name.' '.$method.'& '.($type=='array'?'Array':get_class($real)).' '.$name.$nl;
   
   
// havent parsed this before
   
} else {

       
// insert recursion blocker
       
$var = Array( $block => $var, 'name' => $reference );
       
$theVar =& $var[ $block ] ;

       
// print it out
       
$type = gettype( $theVar ) ;
        switch(
$type ) {
       
            case
'array' :
               
$output .= $indent . $var_name . ' '.$method.' Array ('.$nl;
               
$keys=array_keys($theVar);
                foreach(
$keys as $name) {
                   
$value=&$theVar[$name];
                   
var_log($value, $name, $reference.'["'.$name.'"]', '=', true);
                }
               
$output .= $indent.')'.$nl;
                break ;
           
            case
'object' :
               
$output .= $indent.$var_name.' = '.get_class($theVar).' {'.$nl;
                foreach(
$theVar as $name=>$value) {
                   
var_log($value, $name, $reference.'->'.$name, '->', true);
                }
               
$output .= $indent.'}'.$nl;
                break ;
           
            case
'string' :
               
$output .= $indent . $var_name . ' '.$method.' "'.$theVar.'"'.$nl;
                break ;
               
            default :
               
$output .= $indent . $var_name . ' '.$method.' ('.$type.') '.$theVar.$nl;
                break ;
               
        }
       
       
// $var=$var[$block];
       
   
}
   
    --
$depth ;
   
    if(
$sub == false )
        return
$output ;
       
}

// var_log( $var, '$name' ) ;

?>

Hope it works well for you!
up
0
david at exposito dot mobi
12 years ago
If you want to save exactly the content of an array into a variable to save ir later for example, use this:

<?php $xml = var_export($xml, true); ?>

You'll have in your same variable the content readable, instead of written down or anything else
up
-1
divinity76 at gmail dot com
11 years ago
a html-encoded var_dump

<?php
function htmlvardump(){ob_start(); $var = func_get_args(); call_user_func_array('var_dump', $var); echo htmentities(ob_get_clean());}
?>

(creds: ekneuss / mOo @ irc.freenode.net/#php )
up
-1
vladimir at pixeltomorrow dot com
14 years ago
You can also use the PEAR package available at http://pear.php.net/package/Var_Dump

which parses the variable content in a very pleasant manner, a lot more easier to "follow" than the built-in var_dump() function.

Of course there are many others, but I prefer this one, because it's simply to use.

Just add at the begining of your file:

<?php

require('Var_Dump.php'); // make sure the pear package path is set in php.ini
Var_Dump::displayInit(array('display_mode' => 'HTML4_Text'), array('mode' => 'normal','offset' => 4));
?>

then, instead of simply using var_dump($foo), use:

<?php

Var_Dump
::display($foo);

?>

Read the documentation if you're looking for different output layouts.

Cheers!
Vladimir Ghetau
up
-2
highstrike at gmail dot com
14 years ago
made 2 nifty functions based of what some people contributed here. Hope you find them usefull

usage ... call for the dump function. EG: dump($array, "Array dump");

<?php
////////////////////////////////////////////////////////
// Function:         dump
// Inspired from:     PHP.net Contributions
// Description: Helps with php debugging

function dump(&$var, $info = FALSE)
{
   
$scope = false;
   
$prefix = 'unique';
   
$suffix = 'value';
 
    if(
$scope) $vals = $scope;
    else
$vals = $GLOBALS;

   
$old = $var;
   
$var = $new = $prefix.rand().$suffix; $vname = FALSE;
    foreach(
$vals as $key => $val) if($val === $new) $vname = $key;
   
$var = $old;

    echo
"<pre style='margin: 0px 0px 10px 0px; display: block; background: white; color: black; font-family: Verdana; border: 1px solid #cccccc; padding: 5px; font-size: 10px; line-height: 13px;'>";
    if(
$info != FALSE) echo "<b style='color: red;'>$info:</b><br>";
   
do_dump($var, '$'.$vname);
    echo
"</pre>";
}

////////////////////////////////////////////////////////
// Function:         do_dump
// Inspired from:     PHP.net Contributions
// Description: Better GI than print_r or var_dump

function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
   
$do_dump_indent = "<span style='color:#eeeeee;'>|</span> &nbsp;&nbsp; ";
   
$reference = $reference.$var_name;
   
$keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';

    if (
is_array($var) && isset($var[$keyvar]))
    {
       
$real_var = &$var[$keyvar];
       
$real_name = &$var[$keyname];
       
$type = ucfirst(gettype($real_var));
        echo
"$indent$var_name <span style='color:#a2a2a2'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
       
$var = array($keyvar => $var, $keyname => $reference);
       
$avar = &$var[$keyvar];
   
       
$type = ucfirst(gettype($avar));
        if(
$type == "String") $type_color = "<span style='color:green'>";
        elseif(
$type == "Integer") $type_color = "<span style='color:red'>";
        elseif(
$type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif(
$type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif(
$type == "NULL") $type_color = "<span style='color:black'>";
   
        if(
is_array($avar))
        {
           
$count = count($avar);
            echo
"$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#a2a2a2'>$type ($count)</span><br>$indent(<br>";
           
$keys = array_keys($avar);
            foreach(
$keys as $name)
            {
               
$value = &$avar[$name];
               
do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo
"$indent)<br>";
        }
        elseif(
is_object($avar))
        {
            echo
"$indent$var_name <span style='color:#a2a2a2'>$type</span><br>$indent(<br>";
            foreach(
$avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo
"$indent)<br>";
        }
        elseif(
is_int($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(
is_string($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color\"$avar\"</span><br>";
        elseif(
is_float($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(
is_bool($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(
is_null($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo
"$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $avar<br>";

       
$var = $var[$keyvar];
    }
}
?>
up
-2
fabien dot villepinte at gmail dot com
3 years ago
It's important to note that the output depends on the precision directive.
<?php
var_dump
(10000000000000.5); // float(10000000000000)
ini_set('precision',-1);
var_dump(10000000000000.5); // float(10000000000000.5)
?>
up
-5
jonbarnett at gmail dot com
15 years ago
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. */
?>

官方地址:https://www.php.net/manual/en/function.var-dump.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3