您使用哪个php变量调试功能? var_dump,print_r,var_export,other?

时间:2008-09-26 19:46:01

标签: php debugging

我个人使用var_dump,但很多人都喜欢print_r

每个人都使用什么?优点和缺点?

有人有自己独特的家酿功能吗?

9 个答案:

答案 0 :(得分:4)

我使用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
)    

答案 1 :(得分:4)

我使用这些自定义函数取决于我是处理数组还是单个值:

function show($array)
{
    echo '<pre>';
    print_r($array);
    echo '</pre>';
}

function prn($var)
{
    echo '<br/>' . $var . '<br/>';
}

我发现这些功能简化了故障排除,因为我通常最终需要格式化输出,以便我可以在屏幕上轻松浏览。

对于更复杂的故障排除,我们使用Exception类的扩展版本,它将通过电子邮件发送堆栈跟踪以及特定的错误消息。这给了我所涉及的功能,涉及的文件以及错误中涉及的行或行以及我创建的任何自定义消息,以便我确切知道发生了什么。对于增加的故障排除层,我们还会在要访问的数据库中记录这些错误。

答案 2 :(得分:4)

我总是使用Xdebug扩展的var_dump。它给出了很多详细的输出。

有关详细信息,请参阅:http://xdebug.org/docs/display

答案 3 :(得分:2)

我只是用户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...
}

兴趣是将输出延迟到页面的末尾,避免使实际页面混乱。

答案 4 :(得分:1)

如果你想避免向浏览器发送错误但希望获得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/en/book.outcontrol.php

中的一些好读物

答案 5 :(得分:1)

我觉得有些东西在变量转储函数的标准PHP实现中缺乏,即只能打印部分表达式。​​

这是一个解决这个问题的函数:

function dump($val) {
    echo '<pre>'.var_export($val,true).'</pre>';
    return $val;
}

现在我可以在表达式周围放置一个函数调用,我需要知道它的值,而不会破坏通常的代码执行流程,如下所示:

$a=2+dump(2*2);

使用鲜为人知的 var_export 我也消除了实现输出缓冲以对结果进行后处理的需要。

答案 6 :(得分:1)

当您生成二进制答案(即使用GD库的图像)时,您可以使用有效的调整标题:

header('X-eleg:'.serialize($yourstuff));

并使用Firefox的Http-header扩展来“窥探”它。

答案 7 :(得分:0)

通常是

print_r(),但var_dump()为基元提供了更好的信息。

话虽这么说,我使用Zend Server Debugger完成了大部分实际的调试。

答案 8 :(得分:0)

的var_dump。安装XDebug后,它可以很好地对输出进行格式化和着色(不必在其周围放置<pre>标签。)