请记住,如果您安装了 xdebug,它会将数组元素和对象属性的 var_dump() 输出限制为 3 级深度。
要更改默认值,请编辑您的 xdebug.ini 文件并添加以下行
xdebug.var_display_max_depth=n
更多信息请访问
http://www.xdebug.org/docs/display
(PHP 4, PHP 5, PHP 7, PHP 8)
var_dump — 转储有关变量的信息
此函数显示有关一个或多个表达式的结构化信息,包括其类型和值。数组和对象以递归方式进行探索,其值缩进以显示结构。
除非对象实现了一个 __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)
请记住,如果您安装了 xdebug,它会将数组元素和对象属性的 var_dump() 输出限制为 3 级深度。
要更改默认值,请编辑您的 xdebug.ini 文件并添加以下行
xdebug.var_display_max_depth=n
更多信息请访问
http://www.xdebug.org/docs/display
如果您像我一样,在调试时经常使用 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())。
我发布了一个新的 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") . ";\"> ⤵</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> ";
}
echo $isTerminal ? "\n" : "<br />";
}
for ($i=0; $i <= $level; $i++) {
echo $isTerminal ? "| " : "<span style='color:black'>|</span> ";
}
echo $isTerminal ? "[" . $key . "] => " : "<span style='color:black'>[" . $key . "] => </span>";
call_user_func($recursive, $value, $level+1);
}
if ($notEmpty) {
for ($i=0; $i <= $level; $i++) {
echo $isTerminal ? "| " : "<span style='color:black'>|</span> ";
}
if (!$isTerminal) {
echo "</div>";
}
} else {
echo $isTerminal ?
$type . ($type_length !== null ? "(" . $type_length . ")" : "") . " " :
"<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span> ";
}
} else {
echo $isTerminal ?
$type . ($type_length !== null ? "(" . $type_length . ")" : "") . " " :
"<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span> ";
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);
}
?>
<?php
/**
* 比 print_r 或 var_dump 更好的 GI -- 但是,与 var_dump 不同,你只能转储一个变量。
* 在 echo 之前在 var 内容上添加了 htmlentities,因此您会看到实际的内容,而不是标记。
*
* 此外,现在输出被包含在一个 div 块中,该块设置背景颜色、字体样式并左对齐它
* 因此它不会受到环境样式的影响。
*
* 灵感来自:PHP.net 贡献
* 窃取自:[highstrike at gmail dot com]
* 修改者:stlawson *AT* JoyfulEarthTech *DOT* com
*
* @param mixed $var -- 要转储的变量
* @param string $var_name -- 变量的名称(可选)-- 在打印输出中显示,使其更易于区分复杂输出中的哪个变量是哪个
* @param string $indent -- 由内部递归调用使用(没有已知的外部值)
* @param unknown_type $reference -- 由内部递归调用使用(没有已知的外部值)
*/
function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
$do_dump_indent = "<span style='color:#666666;'>|</span> ";
$reference = $reference.$var_name;
$keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';
// 因此这始终可见,并且始终左对齐且可读
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;'>&$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>";
}
?>
正如 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>';
?>
基于一些人在这里的贡献,制作了两个简洁的功能。希望您发现它们有用
用法... 调用转储函数。例如:dump($array, "Array dump");
<?php
////////////////////////////////////////////////////////
// 函数: dump
// 灵感来自: PHP.net 贡献者
// 描述: 帮助 PHP 调试
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>";
}
////////////////////////////////////////////////////////
// 函数: do_dump
// 灵感来自: PHP.net 贡献者
// 描述: 比 print_r 或 var_dump 更好的 GI
function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
$do_dump_indent = "<span style='color:#eeeeee;'>|</span> ";
$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;'>&$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];
}
}
?>
你好!
我正在做一个非常大的项目,我需要将任何东西的易于阅读的格式转储到日志文件... 而我认为 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 ;
}
// 常量
$nl = "\n" ;
$block = 'a_big_recursion_protection_block';
$c = $depth ;
$indent = '' ;
while( $c -- > 0 ) {
$indent .= '| ' ;
}
// 如果之前解析过
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;
// 之前没有解析过
} else {
// 插入递归阻止器
$var = Array( $block => $var, 'name' => $reference );
$theVar =& $var[ $block ] ;
// 打印出来
$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' ) ;
?>
希望这个函数对您有用!
如果你想将数组的内容精确地保存到一个变量中,以便稍后保存它,可以使用以下代码:
<?php $xml = var_export($xml, true); ?>
这样你就可以在同一个变量中得到可读的内容,而不是写下来或其他任何方式。
我写了这个方便的小函数,用于在 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() 函数愉快。
您也可以使用在 http://pear.php.net/package/Var_Dump 上提供的 PEAR 包
它以一种非常友好的方式解析变量内容,比内置的 var_dump() 函数更容易“理解”。
当然还有许多其他方法,但我更喜欢这个,因为它使用起来很简单。
只需在文件开头添加以下代码:
<?php
require('Var_Dump.php'); // 确保在 php.ini 中设置了 pear 包路径
Var_Dump::displayInit(array('display_mode' => 'HTML4_Text'), array('mode' => 'normal','offset' => 4));
?>
然后,只需使用 Var_Dump($foo) 而不是简单的 var_dump($foo)。
<?php
Var_Dump::display($foo);
?>
如果您需要不同的输出布局,请阅读文档。
干杯!
弗拉基米尔·格塔乌
需要注意的是,输出取决于精度指令。
<?php
var_dump(10000000000000.5); // float(10000000000000)
ini_set('precision',-1);
var_dump(10000000000000.5); // float(10000000000000.5)
?>
一个 HTML 编码的 var_dump
<?php
function htmlvardump(){ob_start(); $var = func_get_args(); call_user_func_array('var_dump', $var); echo htmentities(ob_get_clean());}
?>
(凭据:ekneuss / mOo @ irc.freenode.net/#php )
转储相互引用的对象会导致无限递归。
<?php
$brother = new Sibling();
$sister = new Sibling();
$brother->sister = $sister;
$sister->brother = $brother;
var_dump($brother);
/* 转储 $brother 的所有属性,包括 "sister",这会转储 $sister 的所有属性,包括 "brother",等等。 */
?>