我经常使用print_r($value, true)
在日志语句中转储一些变量,有时我忘记将第二个参数设置为true,这可能导致而不是结果在日志语句中,在大多数情况下它只是迷路了,但有时它甚至会呈现给用户浏览器。
这恰好发生在我身上,并且在对象图中,其中有一些凭据,以及您通常不希望最终用户看到的其他内容。问题是,不是传递true作为第二个参数,由于某种原因我在1年前传递了null。现在有一些系统故障导致错误的输出显示。
如何避免程序员错误导致堆栈跟踪输出?为什么所有PHP转储功能都默认回显输出?搜索我们的代码库,我发现很多print_r的调用没有将第二个参数设置为true。
我有时也使用json_encode()进行调试输出,因为输出有时更简洁,更友好。这种方法有什么缺点吗?
我们通常使用某种输出缓冲,但不是到处都是。
答案 0 :(得分:3)
为什么不创建一个自定义函数来包装所有print_r
个调用?我使用这样的东西:
function good_print() {
$log = '';
foreach(func_get_args() as $arg) $log .= print_r($arg, true);
return $log;
}
它节省了时间,给了我更好的功能,而且我不必担心“这次我使用了正确的电话吗?”
答案 1 :(得分:3)
var_export()返回一个字符串;但是你要记住设置第二个参数
答案 2 :(得分:2)
如何避免程序员错误导致堆栈跟踪输出?
生产时不允许使用简单的非生产代码(var_dump
,print_r
等在生产中永远不会有用。按优先顺序执行构建/测试系统,源代码控制,仅使用可以轻松集中禁用的包装函数执行,或者如果您确实必须使用生产服务器配置。
为什么所有PHP转储功能都默认回显输出?
因为在开发期间最简单。
通过我们的代码库搜索,我发现很多print_r的调用没有将第二个参数设置为true
你也发现了很多or die('some errormessage);
陈述,出于显而易见的原因,在制作中也不是一个好主意。手动代码是插图,而不是生产代码,但很多程序员都会对此进行处理。
我有时也使用json_encode()进行调试输出,因为输出有时更简洁,更友好。这种方法有什么缺点吗?
可能有一些额外的负载,并且没有用于调试的明确指示(如前所述,var_dump
是红旗,json_encode
不是)。
我们通常使用某种输出缓冲,但不是到处都是。
我只在严格需要时使用它,所以,几乎无处可去。
答案 3 :(得分:1)
根据print_r
docs上的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_dump
和print_r
的一个惊人替代品,用于以结构化方式显示PHP变量。