在ob_start中使用print_r

时间:2012-02-17 14:21:23

标签: php

如手册中所述,它不起作用。我试过var_dump它也遇到了同样的问题。

ob_start()
$debugdata=print_r ($var,true)

这会在屏幕上打印结果,而不是存储到变量

2 个答案:

答案 0 :(得分:5)

print_r的第二个参数是$return,它允许输出作为字符串返回而不是输出:

$debugData = print_r($var, true);

没有必要为此使用输出缓冲,实际上它不能使用。您需要在此之前结束输出缓冲,然后在print_r调用后重新启动缓冲:

ob_start();
// stuff
$output = ob_end_clean();

$debugData = print_r($var, true);

ob_start();
// more stuff
$output .= ob_end_clean();

编辑:另一种选择是嵌套输出缓冲区并使内部缓冲区执行print_r工作:

ob_start(); // your original start  
// stuff

ob_start();
print_r($var);
$debugData = ob_get_clean();

// more stuff 
$output = ob_get_clean(); // your original end

答案 1 :(得分:3)

ob_start()开始但缓冲。但是你也需要结束并检索缓冲区的内容。

以下是您可以使用的功能:

ob_get_clean() - 将输出缓冲区的内容放在变量中,结束并清理缓冲区。

ob_start();
print_r($foo);
$output = ob_get_clean();

ob_get_contents() - 获取输出缓冲区的内容而不关闭或清除它。

ob_end_clean() - 关闭并清理缓冲区。

ob_start();
print_r($foo);
$output = ob_get_contents();
ob_end_clean();

还有其他一些可能性。 Please make yourself familiar with the output buffering functions

另外,一句话。您不只是将print_r的输出分配给变量。您只需打印东西就像在屏幕上打印一样。启用输出缓冲后,所有输出都将被缓冲,而不是立即发送到stdout。所以,首先你print_r,然后检索缓冲区的内容。

[编辑]

根据评论中的对话,我建议您查看print_r() manual的备注部分。正如@RomiHalasz和@cbuckley所观察到的,由于print_r的内部输出缓冲,它不能与ob_start()一起使用 使用第二个参数 return ,因为两者将发生碰撞。

您必须使用输出缓冲和普通print_r(仅使用第一个参数),或在将print_r与第二个参数一起使用之前结束输出缓冲。

要么:

ob_start();
print_r($foo);
$output = ob_get_clean();

或者这个:

ob_start();
// blah
$output = ob_get_clean();

$output .= print_r($foo,true);

ob_start();
// blah
$output .= ob_get_clean();