2024 年 PHP Conference Japan

var_dump

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

var_dump傾印關於變數的資訊

描述

var_dump(混合型別 $value, 混合型別 ...$values):

此函式顯示關於一個或多個表達式的結構化資訊,包括其型別和值。陣列和物件會遞迴地展開,並縮排值以顯示結構。

除非物件實作了 __debugInfo() 方法,否則物件的所有公開、私有和受保護屬性都將在輸出中返回。

提示

與任何直接將結果輸出到瀏覽器的操作一樣,可以使用 輸出控制函式 來擷取此函式的輸出,並將其儲存到 字串 中(例如)。

參數

value

要傾印的表達式。

values

要傾印的其他表達式。

返回值

不返回任何值。

範例

範例 #1 var_dump() 範例

<?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"
  }
}
<?php

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

?>

上述範例將輸出

float(3.1)
bool(true)

參見

新增註釋

使用者貢獻的註釋 16 則註釋

rich dot schu at gmail dot com
16 年前
請記住,如果您安裝了 xdebug,它會將 var_dump() 輸出陣列元素和物件屬性的深度限制為 3 層。

要更改預設值,請編輯您的 xdebug.ini 檔案並新增以下行
xdebug.var_display_max_depth=n

更多資訊請參考
http://www.xdebug.org/docs/display
edwardzyang at thewritingpot dot com
19 年前
如果您跟我一樣,在除錯時都會使用 var_dump,那麼您可能會發現這兩個「包裝」函式很有幫助。

這個函式會自動在 var_dump 輸出的前後加上 PRE 標籤,讓您可以得到格式良好的陣列。

<?php

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

?>

這個函式會回傳 var_dump 的值,而不是直接輸出。

<?php

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

?>

相當簡單的函式,但它們非常有用(我現在幾乎只使用 var_dump_pre())。
b dot bergloev at gmail dot com
10 年前
我發布了一個新的 var_dump 函式,具有顏色和摺疊功能。如果您從終端機執行它,它也可以適應終端機輸出。無需將其包裝在 pre 標籤中即可在瀏覽器中使用。

<?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);
}
?>
匿名
19 年前
var_dump(get_defined_vars());
會將所有已定義的變數傾印到瀏覽器。
stlawson *AT* joyfulearthtech *DOT* com
13 年前
<?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>";
}
?>
thriller dot ze at gmail dot com
17 年前
正如 Bryan 所說,可以將 var_dump() 的輸出擷取到字串中。但如果傾印的變數包含 HTML 程式碼,則不完全正確。

您可以改用這個

<?php
echo '<pre>'; // 這是為了正確處理換行字元
ob_start();
var_dump($var);
$a=ob_get_contents();
ob_end_clean();
echo
htmlspecialchars($a,ENT_QUOTES); // 將所有 HTML 特殊字元轉義(尤其是 > 和 <)
echo '</pre>';
?>
egorinsk at gmail com
15 年前
請注意,var_dump 會重置陣列的內部指標!
highstrike at gmail dot com
16 年前
基於一些人的貢獻,我製作了 2 個精巧的函式。希望您覺得它們有用

用法...呼叫 dump 函式。例如:dump($array, "陣列傾印");

<?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];
}
}
?>
匿名
8 年前
請小心,這會輸出到 stdout 串流 (1) 而不是正確的 stderr 串流 (2)。
php at mikeboers dot com
17 年前
您好!

我正在進行一個相當大的專案,需要將任何資料的可讀形式傾印到日誌檔中...而且我覺得 var_export 的輸出難以閱讀。BigueNique at yahoo dot ca 提供了一個不錯的解決方案,雖然我需要在不修改任何傳遞給 dump 的資料的前提下使用它。

因此,我大量借用了 BigueNique 的程式碼(只是稍微修改了他的函式),並參考了物件複製頁面中某人的想法,得到了以下函式。

它會完整複製您最初傳遞給它的任何物件,包括所有遞迴定義和外部物件參考,然後執行與 BigueNique 函式相同的操作。我也根據我的需求,大幅修改了它的輸出。

<?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' ) ;

?>

希望它對您有所幫助!
david at exposito dot mobi
14 年前
如果您想將陣列的內容完全儲存到一個變數中,以便稍後儲存,請使用以下程式碼

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

您將在同一個變數中獲得可讀的內容,而不是寫下來的內容或其他任何東西。
kobrasrealm at gmail dot com
13 年前
我寫了這個很棒的小函式,可以用在 HTML 文件上使用 var_dump(),這樣我就不必查看原始碼了。

<?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";
}
?>

您可以像這樣傳遞參數
<?php
$sql
= mysql_query("SELECT id, name, value FROM table WHERE cond = 'value'");
$s = mysql_fetch_assoc($sql);

// 傾印包含 MySQL 查詢結果的變數
var_dump($s);
?>

第二個參數可讓您指定方塊的高度。預設值為 9em,但如果您預期輸出很大,則可能需要更高的值。

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

祝您使用 var_dump 順利。
vladimir at pixeltomorrow dot com
17 年前
您也可以使用 PEAR 套件,網址為 http://pear.php.net/package/Var_Dump

它以一種非常友好的方式解析變數內容,比內建的 var_dump() 函式更容易「理解」。

當然還有很多其他的套件,但我更喜歡這個,因為它使用起來很簡單。

只需在檔案開頭添加

<?php

require('Var_Dump.php'); // 確保 pear 套件路徑已在 php.ini 中設定
Var_Dump::displayInit(array('display_mode' => 'HTML4_Text'), array('mode' => 'normal','offset' => 4));
?>

然後,不要直接使用 var_dump($foo),而是使用

<?php

Var_Dump
::display($foo);

?>

如果您正在尋找不同的輸出佈局,請閱讀文件。

加油!
Vladimir Ghetau
fabien dot villepinte at gmail dot com
5 年前
需要注意的是,輸出取決於 precision 指令。
<?php
var_dump
(10000000000000.5); // float(10000000000000)
ini_set('precision',-1);
var_dump(10000000000000.5); // float(10000000000000.5)
?>
divinity76 at gmail dot com
13 年前
HTML 編碼的 var_dump

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

(感謝:ekneuss / mOo @ irc.freenode.net/#php )
jonbarnett at gmail dot com
18 年前
傾印互相引用的物件可能會導致無限遞迴
<?php
$brother
= new Sibling();
$sister = new Sibling();
$brother->sister = $sister;
$sister->brother = $brother;

var_dump($brother);
/* 傾印 $brother 的所有屬性,包括 "sister",它會傾印 $sister 的所有屬性,包括 "brother",依此類推。 */
?>
To Top