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

后端 未结 13 1450
挽巷
挽巷 2020-11-27 08:39

I\'d like to capture the output of var_dump to a string.

The PHP documentation says;

As with anything that outputs its result directly to the

相关标签:
13条回答
  • 2020-11-27 09:15

    Long string: Just use echo($var); instead of dump($var);.

    Object or Array: var_dump('<pre>'.json_encode($var).'</pre>);'

    0 讨论(0)
  • 2020-11-27 09:19

    Also echo json_encode($dataobject); might be helpful

    0 讨论(0)
  • 2020-11-27 09:20

    If you want to have a look at a variable's contents during runtime, consider using a real debugger like XDebug. That way you don't need to mess up your source code, and you can use a debugger even while normal users visit your application. They won't notice.

    0 讨论(0)
  • 2020-11-27 09:21

    Try var_export

    You may want to check out var_export — while it doesn't provide the same output as var_dump it does provide a second $return parameter which will cause it to return its output rather than print it:

    $debug = var_export($my_var, true);
    

    Why?

    I prefer this one-liner to using ob_start and ob_get_clean(). I also find that the output is a little easier to read, since it's just PHP code.

    The difference between var_dump and var_export is that var_export returns a "parsable string representation of a variable" while var_dump simply dumps information about a variable. What this means in practice is that var_export gives you valid PHP code (but may not give you quite as much information about the variable, especially if you're working with resources).

    Demo:

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

    The difference in output:

    var_export ($debug_export in above example):

     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 in above example):

     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
    }
    

    print_r ($debug_printr in above example):

    Array
    (
        [bool] => 
        [int] => 1
        [float] => 3.14
        [string] => hello world
        [array] => Array
            (
            )
    
        [object] => stdClass Object
            (
            )
    
        [resource] => Resource id #4
        [null] => 
    )
    

    Caveat: var_export does not handle circular references

    If you're trying to dump a variable with circular references, calling var_export will result in a PHP warning:

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

    Results in:

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

    Both var_dump and print_r, on the other hand, will output the string *RECURSION* when encountering circular references.

    0 讨论(0)
  • 2020-11-27 09:21

    From 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.

    function assignVarDumpValueToString($object) {
        ob_start();
        var_dump($object);
        $result = ob_get_clean();
        return $result;
    }
    

    ob_get_clean() can only clear last data entered to internal buffer. So ob_get_contents method will be useful if you have multiple entries.

    From the same source as above:

    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
    }
    
    0 讨论(0)
  • 2020-11-27 09:22

    From the PHP manual:

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

    So, here is the real return version of PHP's var_dump(), which actually accepts a variable-length argument list:

    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 '';
    }
    
    0 讨论(0)
提交回复
热议问题