var_dump、var_export和print_r之间的区别

138

var_dump, var_exportprint_r有什么区别?


14
有时候向别人请教比阅读手册更容易理解。 - Deepak Lamichhane
12
你常见的S.O.(Stack Overflow)回答通常比PHP手册更清晰、更简洁、更易操作,基本上也更容易查找。 - Mark Fox
2个回答

210

var_dump是用于调试的。 var_dump总是打印出结果。

// var_dump(array('', false, 42, array('42')));
array(4) {
  [0]=> string(0) ""
  [1]=> bool(false)
  [2]=> int(42)
  [3]=> array(1) {[0]=>string(2) "42")}
}

print_r也是用于调试的,但不包含成员的类型信息。如果您知道数组中元素的类型,使用它是一个好主意,否则可能会导致误解。print_r默认会输出结果,但可以通过使用可选参数$return来将其作为字符串返回。

Array (
    [0] =>
    [1] =>
    [2] => 42
    [3] => Array ([0] => 42)
)

var_export 能够输出有效的php代码。如果你计算了一些值,并希望它们作为常量在另一个脚本中使用,那么 var_export 就非常有用了。需要注意的是,var_export 无法处理引用循环/递归数组,而 var_dump 和 print_r 可以检查这些情况。var_export 默认会将结果打印出来,但是可以通过使用可选的 $return 参数,使其返回字符串。

array (
  0 => '',
  1 => false,
  2 => 42,
  3 => array (0 => '42',),
)

就我个人而言,我认为var_export是简洁和精确的最佳折中。


54
请注意,由于其特性,var_export在处理递归数组时会发生可怕的递归错误。print_rvar_dump(虽然对后者不是完全确定,因为我通常不使用它)没有这个问题。因此,不要使用var_export($_GLOBALS),因为它包含了自身。 :) - pinkgothic
1
应该补充说明的是,你可以让print_r()和var_export()返回一个字符串而不是输出它,而var_dump()则不能。 此外,我不喜欢var_export(),因为它很容易让人困惑——如果你尝试导出一些未定义的常量SOMECONST,你只会得到一个文本字符串“SOMECONST”。所以它不会说NULL、0、"",但它实际上会假定它是一个字符串(我想还会抛出一个NOTICE)。 - userfuser
1
var_export很适合安全地表示字符串,例如引号/反斜杠保护。 - dkellner
@WebChemist 为什么不呢?这样实现起来更容易,如果我决定在其他地方使用输出,我只需添加一行而无需担心必须修改先前的最后一行。 - phihag
1
个人而言,我更喜欢使用 var_dump 输出。可惜它不允许将输出作为字符串返回。因此,我可以理解上面评论中 @iconoclast 的感受。但是,在这种情况下选择 var_export 而不是 var_dump 对我来说是可以接受的。为了完整起见,请注意这个相关的 功能请求 - pjvleeuwen
显示剩余4条评论

4

var_dumpvar_export的关系如下(来自手册)

var_export()获取给定变量的结构化信息。它类似于var_dump(),但有一个例外:返回的表示是有效的PHP代码。

它们与print_r的不同之处在于var_dump导出更多的信息,如元素的数据类型和大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接