var_dump严格保留原始类型和结构,print_r会丢失bool/null类型、浮点精度、长度及资源细节;调试需精确类型时必须用var_dump,快速查看结构可用print_r。

print_r 会丢失类型信息,特别是 bool 和 null
当你用 print_r 输出 array(true, false, null),结果是 Array( [0] => 1 [1] => [2] => ) —— true 变成 1,false 变成空,null 直接消失。这不是显示问题,是它内部做了隐式转换。而 var_dump 严格保留原始类型:bool(true)、bool(false)、NULL,连大小写和大写都原样输出。
常见踩坑点:
- 调试条件逻辑时误判
true/false值,以为是整数或空字符串 - 检查 API 返回的
null字段是否真实存在,print_r看不到就容易漏判 -
print_r对浮点数可能四舍五入(如3.1415926显示为3.14159),var_dump显示完整精度
var_dump 显示长度、嵌套层级和资源细节,print_r 简化处理
var_dump("hello") 输出 string(5) "hello",明确标出长度;print_r("hello") 只输出 hello。对数组嵌套,var_dump 每层缩进+类型标注,比如 array(2) { ["data"]=> array(1) { [0]=> string(4) "item" } };print_r 则压缩成 Array ( [data] => Array ( [0] => item ) ),省略类型和长度,深层结构容易看串行。
资源类型差异更明显:
-
fopen()返回的句柄,var_dump显示resource(3, stream) -
print_r只显示Resource id #3,无法区分是文件、数据库连接还是 socket -
var_export对资源直接返回NULL,连 ID 都不显示 —— 所以真要查资源,只能靠var_dump
输出控制方式相同,但默认行为影响调试流
两者都支持第二个参数 $return = true 来捕获输出而非直接打印,例如:
$arr = ['a' => 1, 'b' => null]; $output = var_dump($arr, true); // $output 是字符串 // 或 $output = print_r($arr, true); // 同样生效
但注意:print_r 会把数组内部指针移到末尾,如果后续还要遍历该数组,得手动 reset($arr);var_dump 不动指针,无副作用。
另外,print_r 在遇到循环引用(如 $arr['self'] = &$arr)时可能卡死或报错(PHP 4.0.4 之前无限递归),var_dump 内置保护机制,能安全终止并标记 *RECURSION*。
什么时候该用哪个?看你要确认什么
快速扫一眼数组结构、键名和大致值,且不关心类型 —— 用 print_r,输出干净,适合日志里临时 dump。
确认变量是否真的是 bool、int、NULL,查字符串长度、嵌套深度、资源类型,或者在单元测试里做断言比对 —— 必须用 var_dump。
想把变量内容转成可复用的 PHP 代码(比如生成 fixture 数据),才轮到 var_export;它输出的是合法语法,但代价是不支持资源、对循环引用更敏感。
真正容易被忽略的是:线上环境关了 display_errors,var_dump 的输出可能被静默吞掉,而 error_log(var_export($x, true)) 这种写法反而更稳 —— 但那是另一个问题了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











