Menu

PHP var_dump() 和 print_r():打印数组与调试

print_r($array) 以易读的形式打印数组,var_dump($value) 还会显示每个值的类型和长度,var_export 则输出合法的 PHP 代码。学习三者各自的用法、如何把 print_r 的结果作为字符串返回,以及如何在 HTML 中用 <pre> 美化输出。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

print_r($array) 以易读的形式打印数组或对象的键和值。var_dump($value) 打印同样的结构,外加每个值的类型和长度。想看数组里有什么就用 print_r;需要分清一个值是 "1" 还是 1 时,就用 var_dump。

对比两段输出中的 admin:print_r 在箭头后面什么都没打印,var_dump 打印了 bool(false)。这个区别正是调试时选用 var_dump 的主要原因。

print_r、var_dump 和 var_export 对比

这三个函数显示的是同样的数据,只是详细程度不同:

print_rvar_dumpvar_export
显示类型否是以 PHP 字面量表示
false、null、""什么都不打印bool(false)、NULL、string(0) ""false、NULL、''
能否返回字符串print_r($x, true)否var_export($x, true)
输出是合法的 PHP否否是
一次调用打印多个值否var_dump($a, $b)否

print_r 最易读,var_dump 最精确,var_export 给出可以粘贴回文件的代码。

把 print_r 的输出作为字符串

第二个参数传 true,print_r 就会返回文本,而不是打印出来。把数组写入日志文件,或者放进一段更长的消息里,都是这样做的。

var_export($value, true) 也以同样的方式返回字符串。var_dump 总是直接打印,要捕获它的输出就得用输出缓冲:ob_start(); var_dump($x); $text = ob_get_clean();。

在 HTML 中用 pre 美化打印数组

在浏览器里,print_r 输出的换行和空格会挤成一长行,因为 HTML 会忽略空白。把输出包在 <pre> 里就能保留排版。运行下面的代码,然后查看“页面”标签页。

只要数据里可能出现 < 或 &,比如用户输入,就必须用 htmlspecialchars:否则浏览器会把这些文本当作 HTML 处理。如果数据要发给 JavaScript 或 API,json_encode 的形式往往最实用。

一次打印多个值

var_dump 可以接收任意数量的参数,并依次打印每一个,用来并排比较两个值非常方便。

输出说明了为什么 == 认为它们相等而 === 不这么认为:一个是 string(2) "42",另一个是 int(42)。

打印对象

这三个函数也都能打印对象。var_dump 和 print_r 会标出 private 和 protected 属性([label:Point:private]),当某个属性好像不见了时,这很有帮助。

var_dump 输出中的 #1 是对象的 id。两个变量显示相同的 id,就说明它们指向同一个对象。

常见错误:echo 一个数组

echo 会把参数转换成字符串。数组没有字符串形式,所以 PHP 会打印单词 Array 并发出警告:

<?php
$colors = ["red", "green", "blue"];
echo $colors;

PHP 打印:

Warning: Array to string conversion in /home/index.php on line 3
Array

用上面介绍的函数打印内容,或者自己把值拼接起来:

implode 适合把列表展示给用户,json_encode 适合日志和 API,print_r 或 var_dump 适合你自己调试。

常见问题

var_dump 和 print_r 有什么区别?

print_r 以简短易读的形式显示键和值。var_dump 还会显示每个值的类型和长度,例如 string(3) "Ada" 和 bool(false),所以类型很重要时就用它。print_r(false) 什么都不打印,而 var_dump(false) 会打印 bool(false)。

怎么把 print_r 的输出作为字符串拿到?

第二个参数传 true:$text = print_r($array, true); 会返回文本而不是打印出来,这样就可以用 error_log($text) 写入日志,或者存进变量。var_export($value, true) 也是同样的用法;var_dump 没有这个选项。

怎么在浏览器中漂亮地打印数组?

把输出包在 <pre> 标签里,浏览器就会保留换行和缩进:echo '<pre>' . print_r($array, true) . '</pre>';。如果数据可能包含 HTML,先用 htmlspecialchars 转义。

为什么 echo 一个数组会打印 Array?

echo 会把参数转换成字符串,而数组转换成字符串就是单词 Array,同时出现警告 "Array to string conversion"。要打印内容,用 print_r、var_dump、implode(', ', $arr) 或 json_encode($arr)。

PHP 中 var_export 有什么作用?

它把值输出为合法的 PHP 代码,例如 array ( 0 => 'a', ),可以直接粘贴回脚本里。第二个参数传 true 时,它会把代码作为字符串返回,一些工具就是这样写入配置缓存文件的。

Coddy 编程语言插图

和 Coddy 一起学编程

开始