首页 文章

如何将var_dump的结果捕获到字符串?

提问于
浏览
536

我想将var_dump的输出捕获到一个字符串 .

PHP文档说;

与将结果直接输出到浏览器的任何内容一样,输出控制函数可用于捕获此函数的输出,并将其保存在字符串中(例如) .

有人能给我一个如何运作的例子吗?

print_r() isn 't a valid possibility because it'不会给我提供我需要的信息 .

11 回答

  • 11

    您也可以尝试使用serialize()函数,有时它对于调试puprposes非常有用 .

  • 536

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

  • 62

    尝试var_export

    您可能想要查看var_export - 虽然它没有提供与 var_dump 相同的输出,但它确实提供了第二个 $return 参数,这将导致它返回其输出而不是打印它:

    $debug = var_export($my_var, true);
    

    为什么?

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

    var_dumpvar_export 之间的区别在于 var_export 返回"parsable string representation of a variable"而 var_dump 只是转储有关变量的信息 . 这在实践中意味着 var_export 为您提供了有效的PHP代码(但可能无法提供有关该变量的更多信息,特别是如果您正在使用resources) .

    演示:

    $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):

    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):

    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
    }
    
    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警告:

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

    结果是:

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

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

  • 780

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

  • 7

    我知道这个问题很老,但是没有人提到这一点 .

    来自PHP manual

    此函数显示有关包含其类型和值的一个或多个表达式的结构化信息 .

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

    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 '';
    }
    

    干杯 .

  • 15

    使用输出缓冲:

    <?php
    ob_start();
    var_dump($someVar);
    $result = ob_get_clean();
    ?>
    
  • -2
    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();
    }
    
  • 5

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

    var_dump和print_r函数只能直接输出到浏览器 . 所以这些函数的输出只能通过使用php的输出控制函数来检索 . 以下方法可用于保存输出 . function assignVarDumpValueToString($ object){
    ob_start();
    的var_dump($对象);
    $ result = ob_get_clean();
    返回$ result;
    }

    ob_get_clean()只能清除输入到内部缓冲区的最后数据 . 因此,如果您有多个条目,ob_get_contents方法将非常有用 .

    来自上面的相同来源:

    function varDumpToErrorLog($ var = null){
    ob_start(); //开始阅读内部缓冲区
    var_dump($ var);
    $ grabbed_information = ob_get_contents(); //将内部缓冲区内容分配给变量
    ob_end_clean(); //清除内部缓冲区 .
    error_log($ grabbed_information); //将信息保存到error_log
    }

  • 2

    这是功能完整的解决方案 .

    function varDumpToString ($var)
    {
        ob_start();
        var_dump($var);
        return ob_get_clean();
    }
    
  • 3

    你也可以这样做:

    $dump = print_r($variable, true);
    
  • 12

    这可能有点偏离主题 .

    我正在寻找一种方法将这种信息写入我的PHP-FPM容器的Docker日志,并提出了下面的代码片段 . 我确信这可以被Docker PHP-FPM用户使用 .

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

相关问题