在PHP中是否有一个print_r或var_dump等效,默认情况下不会回显结果?

时间:2012-02-08 21:35:44

标签: php logging

我经常使用print_r($value, true)在日志语句中转储一些变量,有时我忘记将第二个参数设置为true,这可能导致而不是结果在日志语句中,在大多数情况下它只是迷路了,但有时它甚至会呈现给用户浏览器。

这恰好发生在我身上,并且在对象图中,其中有一些凭据,以及您通常不希望最终用户看到的其他内容。问题是,不是传递true作为第二个参数,由于某种原因我在1年前传递了null。现在有一些系统故障导致错误的输出显示。

如何避免程序员错误导致堆栈跟踪输出?为什么所有PHP转储功能都默认回显输出?搜索我们的代码库,我发现很多print_r的调用没有将第二个参数设置为true。

我有时也使用json_encode()进行调试输出,因为输出有时更简洁,更友好。这种方法有什么缺点吗?

我们通常使用某种输出缓冲,但不是到处都是。

5 个答案:

答案 0 :(得分:3)

为什么不创建一个自定义函数来包装所有print_r个调用?我使用这样的东西:

function good_print() {
    $log = '';
    foreach(func_get_args() as $arg) $log .= print_r($arg, true);
    return $log;
}

它节省了时间,给了我更好的功能,而且我不必担心“这次我使用了正确的电话吗?”

答案 1 :(得分:3)

如果第二个参数为true,则

var_export()返回一个字符串;但是你要记住设置第二个参数

答案 2 :(得分:2)

  

如何避免程序员错误导致堆栈跟踪输出?

生产时不允许使用简单的非生产代码(var_dumpprint_r等在生产中永远不会有用。按优先顺序执行构建/测试系统,源代码控制,仅使用可以轻松集中禁用的包装函数执行,或者如果您确实必须使用生产服务器配置。

  

为什么所有PHP转储功能都默认回显输出?

因为在开发期间最简单

  

通过我们的代码库搜索,我发现很多print_r的调用没有将第二个参数设置为true

你也发现了很多or die('some errormessage);陈述,出于显而易见的原因,在制作中也不是一个好主意。手动代码是插图,而不是生产代码,但很多程序员都会对此进行处理。

  

我有时也使用json_encode()进行调试输出,因为输出有时更简洁,更友好。这种方法有什么缺点吗?

可能有一些额外的负载,并且没有用于调试的明确指示(如前所述,var_dump是红旗,json_encode不是)。

  

我们通常使用某种输出缓冲,但不是到处都是。

我只在严格需要时使用它,所以,几乎无处可去。

答案 3 :(得分:1)

根据print_rdocs上的PHP手册文档,您可以告诉print_r返回结果,而不是使用第二个可选的bool参数输出结果:

$test = array('var1', 'var2');
$val = print_r($test, TRUE); // won't output anything
echo $val; // output the normal print_r goodness you know and love

<强>更新

实际读完问题之后我会建议@ davethegr8的解决方案,所以你和其他人应该在这个答案上投票支持。另一个实现:

function _print_r($val, $return=TRUE)
{
  print_r($val, $return);
}

最后,当您使用测试驱动开发时会发生一件有趣的事情:您不会在测试调试语句中丢失源代码,因为您已经在单元测试中处理了

答案 4 :(得分:0)

  

如何避免程序员错误导致堆栈跟踪输出?

您可以设置仅在设置了DEBUG选项时打印错误的自定义方法。

define('DEBUG', "DEBUG"); 

function print_log($input) {
    if (defined("DEBUG")) {
        print_r($input, true);
    }
}

而不是致电print_r而只是致电print_log

您可能还想查看Krumo,这是var_dumpprint_r的一个惊人替代品,用于以结构化方式显示PHP变量。