我们使用哪个php变量调试功能? var_dump,print_r,var_export和其他?
我个人使用var_dump,但是很多人喜欢print_r。
每个人都用什么?优点和缺点?
有人有自己的特殊家庭酿造功能吗?
解决方案
我使用print_r()是因为我喜欢漂亮的数组结构...但是var_dump确实为我们提供了更多信息(如类型)
$obj = (object) array(1, 2, 3);
// output of var_dump:
object(stdClass)#1 (3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
// output of print_r
stdClass Object
(
[0] => 1
[1] => 2
[2] => 3
)
我使用这些自定义函数取决于我处理的是数组还是单个值:
function show($array)
{
echo '<pre>';
print_r($array);
echo '</pre>';
}
function prn($var)
{
echo '<br/>' . $var . '<br/>';
}
我发现这些功能简化了故障排除,因为我通常最终需要格式化输出,以便可以在屏幕上轻松浏览它。
对于更复杂的疑难解答,我们使用Exception类的扩展版本,该扩展类将通过电子邮件发送堆栈跟踪以及特定的错误消息。这为我提供了所涉及的功能,所涉及的文件以及错误中涉及的行或者行以及我创建的任何自定义消息,以便使我确切地知道发生了什么。为了进行更多的故障排除,我们还将这些错误记录在正在访问的数据库中。
我只使用print_r,以及几个包装函数来存储我放入代码中的各种DebugPrint,然后在页脚中保存一个以将堆栈转储到页面(或者文件)中。
我现在也尝试使用XDebug ... :-D
好的,为了记录,我给我一些小功能...
// Primitive debug message storage
// $level = "Info", "Warn", "Error", "Title"
function DebugPrint($toDump, $level = "Info") {
global $debugMode, $debugDump, $debugCount;
if ($debugMode != 'N') {
$debugDump[$debugCount++] = "<div class='Dbg$level'>" . $toDump . "</div>\n";
}
}
// Initialize debug information collection
$debugMode = 'N'; // N=no, desactivated, P=dump to Web page, F=dump to file
$debugSavePath = 'C:\www\App\log_debug.txt'; // If mode F
$debugDump = array();
$debugCount = 0;
// Primitive debug message dump
function DebugDump() {
global $debugMode, $debugSavePath, $debugDump, $debugCount;
if ($debugMode == 'F') {
$fp = fopen($debugSavePath, "a"); #open for writing
}
if ($debugCount > 0) {
switch ($debugMode) {
case 'P':
echo '<div style="color: red; background: #8FC; font-size: 24px;">Debug:<br />
';
for ($i = 0; $i < $debugCount; $i++) {
echo $debugDump[$i];
}
echo '</div>
';
break;
case 'F':
for ($i = 0; $i < $debugCount; $i++) {
fputs($fp, $debugDump[$i]);
}
break;
//~ default:
//~ echo "debugMode = $debugMode<br />\n";
}
}
if ($fp != null) {
fputs($fp, "-----\n");
fclose($fp);
}
}
// Pre array dump
function DebugArrayPrint($array) {
global $debugMode;
if ($debugMode != 'N') {
return "<pre class='ArrayPrint'>" . print_r($array, true) . "</pre>";
} else return ""; // Gain some microseconds...
}
感兴趣的是将输出延迟到页面末尾,避免使实际页面混乱。
如果要避免向浏览器发送错误,但希望使用var_dump和print_r的优点,请查看输出缓冲:
ob_start(); var_dump($this); echo $that; print_r($stuff); $out = ob_get_contents(); ob_end_clean(); user_error($out);
在http://www.php.net/manual/zh/book.outcontrol.php中有一些不错的阅读
通常使用print_r(),但是var_dump()为基本类型提供了更好的信息。
话虽这么说,我大部分的实际调试工作都是通过Zend Server Debugger进行的。
我发现有些有用的东西是变量转储函数的标准PHP实现所缺少的,即仅打印表达式的一部分的能力。
这是一个解决此问题的函数:
function dump($val) {
echo '<pre>'.var_export($val,true).'</pre>';
return $val;
}
现在,我可以将函数调用放到需要知道的值的表达式周围,而不会扰乱通常的代码执行流程,如下所示:
$a=2+dump(2*2);
通过使用鲜为人知的var_export,我还消除了实现输出缓冲以对结果进行后处理的需要。
我总是使用Xdebug扩展的var_dump。它给出了很多详细的输出。
有关更多详细信息,请参见:http://xdebug.org/docs/display。
当我们生成二进制答案(即使用GD库的图片)时,我们可以使用有效的已调整标头:
header('X-eleg:'.serialize($yourstuff));
并使用Firefox的Http标头扩展名"间谍"它。
var_dump。安装了XDebug后,它可以很好地格式化和着色输出(不必在其周围放置<pre>标记)。

