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_r | var_dump | var_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 时,它会把代码作为字符串返回,一些工具就是这样写入配置缓存文件的。