var_dump,var_export和print_r之间​​的区别


Answers:


194

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_dumpprint_r检查这些。var_export默认情况下,打印结果,但允许使用字符串形式返回,而不是使用可选$return参数。

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

我个人认为var_export,简洁和精确是最好的折衷方案。


51
请注意var_export,由于其性质,将在递归数组上导致可怕的递归死亡。print_r并且var_dump(尽管,对于后者,不是很确定,因为我通常不使用它)没有这个问题。因此var_export($_GLOBALS);,例如,不要包含它本身。:)
pinkgothic 2011年

@ftrotter我一直以为评论会很好地解释好奇心,但是您可以在答案中添加简短说明。
phihag 2013年

1
应该补充的是,您可以使print_r()和var_export()返回一个字符串而不是输出它,而var_dump()不能这样做。另外,我不喜欢var_export(),因为它令人困惑-如果您尝试导出一些未定义的常量SOMECONST,您将只获得文本字符串'SOMECONST'。因此,它不会说NULL,0,“”,但实际上会假定它是一个字符串(我想也抛出一个NOTICE)。
userfuser 2014年

1
var_export非常适合安全地表示字符串,例如引号/反斜杠保护。
dkellner

1
我个人更喜欢var_dump输出。太糟糕了,它不允许将输出作为字符串返回。因此,我可以在上面的评论中提及@iconoclast的观点。但不得不选择var_exportvar_dump这个用例是可以接受我。为了完整起见,请注意此相关功能要求
Paul van Leeuwen

3

var_dumpvar_export像这样关联(来自手册

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

他们从不同print_r的是var_dump出口更多的信息,如数据类型和元素的大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.