关于php:如何将var_dump的结果捕获到字符串中?

How can I capture the result of var_dump to a string?

我想把var_dump的输出捕获到一个字符串中。

php文档说:

As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).

有人能给我举一个例子说明这可能是如何工作的吗?

print_r()不是一个有效的可能性,因为它不会给我所需要的信息。


试试var_export

您可能希望签出var_export—虽然它没有提供与var_dump相同的输出,但它提供了第二个$return参数,这将导致它返回其输出,而不是打印它:

1
$debug = var_export($my_var, true);

为什么?

我更喜欢这一行,而不是使用ob_startob_get_clean()。我还发现输出更容易阅读,因为它只是PHP代码。

var_dumpvar_export的区别在于,var_export返回一个"可分的变量字符串表示",而var_dump只是转储一个变量的信息。这在实践中意味着,var_export为您提供了有效的PHP代码(但可能无法提供有关变量的足够信息,尤其是在使用资源的情况下)。

演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$demo = array(
   "bool" => false,
   "int" => 1,
   "float" => 3.14,
   "string" =>"hello world",
   "array" => array(),
   "object" => new stdClass(),
   "resource" => tmpfile(),
   "null" => null,
);

// var_export -- nice, one-liner
$debug_export = var_export($demo, true);

// var_dump
ob_start();
var_dump($demo);
$debug_dump = ob_get_clean();

// print_r -- included for completeness, though not recommended
$debug_printr = print_r($demo, true);

输出差异:var_export(上述示例中的$debug_export):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 array (
  'bool' => false,
  'int' => 1,
  'float' => 3.1400000000000001,
  'string' => 'hello world',
  'array' =>
  array (
  ),
  'object' =>
  stdClass::__set_state(array(
  )),
  'resource' => NULL, // Note that this resource pointer is now NULL
  'null' => NULL,
)

var_dump(上述示例中的$debug_dump):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 array(8) {
  ["bool"]=>
  bool(false)
  ["int"]=>
  int(1)
  ["float"]=>
  float(3.14)
  ["string"]=>
  string(11)"hello world"
  ["array"]=>
  array(0) {
  }
  ["object"]=>
  object(stdClass)#1 (0) {
 }
  ["resource"]=>
  resource(4) of type (stream)
  ["null"]=>
  NULL
}

打印(上例中的$debug_printr):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array
(
    [bool] =>
    [int] => 1
    [float] => 3.14
    [string] => hello world
    [array] => Array
        (
        )

    [object] => stdClass Object
        (
        )

    [resource] => Resource id #4
   [null] =>
)

警告:var_export不处理循环引用

如果试图用循环引用转储变量,调用var_export将导致php警告:

1
2
3
 $circular = array();
 $circular['self'] =& $circular;
 var_export($circular);

结果:

1
2
3
4
5
6
7
 Warning: var_export does not handle circular references in example.php on line 3
 array (
   'self' =>
   array (
     'self' => NULL,
   ),
 )

另一方面,当遇到循环引用时,var_dumpprint_r都将输出字符串*RECURSION*


使用输出缓冲:

1
2
3
4
5
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>


你也可以这样做:

1
$dump = print_r($variable, true);


您也可以尝试使用serialize()功能,有时它对去除蛹非常有用。


1
2
3
4
5
6
7
function return_var_dump(){
    //works like var_dump, but returns a string instead of printing it.
    $args=func_get_args(); //for <5.3.0 support ...
    ob_start();
    call_user_func_array('var_dump',$args);
    return ob_get_clean();
}


另外,echo json_encode($dataobject);可能会有所帮助。


我知道这个问题由来已久,但没有人提到这一点。

从PHP手册:

This function displays structured information about one or more expressions that includes its type and value.

所以,这里是php的var_dump()的实际返回版本,它实际上接受一个可变长度的参数列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function var_dump_str()
{
    $argc = func_num_args();
    $argv = func_get_args();

    if ($argc > 0) {
        ob_start();
        call_user_func_array('var_dump', $argv);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }

    return '';
}

干杯。


如果您想在运行时查看变量的内容,可以考虑使用像xdebug这样的真正的调试器。这样,您就不需要把源代码弄乱,甚至在普通用户访问您的应用程序时也可以使用调试器。他们不会注意到的。


以下是完整的功能解决方案。

1
2
3
4
5
6
function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}


这可能有点离题。

我正在寻找一种方法,将这种信息写到我的php-fpm容器的docker日志中,并得出下面的代码片段。我相信Docker PHP-FPM用户可以使用它。

1
fwrite(fopen('php://stdout', 'w'), var_export($object, true));


我真的很喜欢var_dump()的冗长输出,对var_export()print_r()的输出不满意,因为它没有提供那么多信息(例如数据类型丢失、长度丢失)。

为了编写安全和可预测的代码,有时区分空字符串和空字符串很有用。或者介于1和1之间。或者介于零和假之间。所以我想在输出中输入我的数据类型。

虽然有帮助,但在现有的响应中,我没有找到一个干净而简单的解决方案来将var_dump()的彩色输出转换为人类可读的输出,转换为不带HTML标记的字符串,并包括var_dump()的所有细节。

注意,如果你有一个彩色的var_dump(),这意味着你已经安装了xdebug,它会覆盖php的默认var_dump()来添加HTML颜色。

出于这个原因,我创造了这个微小的变化,给出了我所需要的:

1
2
3
4
5
6
7
function dbg_var_dump($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        return strip_tags(strtr($result, ['=&gt;' => '=>']));
    }

返回下面的尼斯字符串:

1
2
3
4
5
6
7
array (size=6)
  'functioncall' => string 'add-time-property' (length=17)
  'listingid' => string '57' (length=2)
  'weekday' => string '0' (length=1)
  'starttime' => string '00:00' (length=5)
  'endtime' => string '00:00' (length=5)
  'price' => string '' (length=0)

希望它能帮助别人。


从http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.html:

var_dump and print_r functions can only output directly to browser. So the output of these functions can only retrieved by using output control functions of php. Below method may be useful to save the output.

1
2
3
4
5
6
function assignVarDumpValueToString($object) {
    ob_start();
    var_dump($object);
    $result = ob_get_clean();
    return $result;
}

ob_get_clean()只能清除最后输入到内部缓冲区的数据。所以如果您有多个条目,ob-get-contents方法将非常有用。

与上述来源相同:

1
2
3
4
5
6
7
function varDumpToErrorLog( $var=null ){
    ob_start();                    // start reading the internal buffer
    var_dump( $var);          
    $grabbed_information = ob_get_contents(); // assigning the internal buffer contents to variable
    ob_end_clean();                // clearing the internal buffer.
    error_log( $grabbed_information);        // saving the information to error_log
}