当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将var_dump的结果捕获到字符串?》经验,为你挑选了9个好方法。

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

PHP文档说;

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

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

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



1> inxilpro..:
尝试 var_export

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

$debug = var_export($my_var, true);

为什么?

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

var_dump和之间的区别var_exportvar_export返回"变量的可解析字符串表示",var_dump只是转储有关变量的信息.这在实践中意味着var_export为您提供有效的PHP代码(但可能无法提供有关变量的更多信息,特别是如果您正在使用资源).

演示:

$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
}

print_r($debug_printr在上面的例子中):

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*遇到循环引用时.


这绝对是一个比被接受的答案更好的答案.我很惊讶它没有更多的赞成!你能详细说明为什么它可能不会提供他正在寻找的所有信息吗?
@JMTyler var_export返回一个*parsable*string-本质上是PHP代码 - 而var_dump提供数据的原始转储.因此,例如,如果在值为1的整数上调用var_dump,则会打印`int(1)`而var_export只打印出`1`.
如果你使用$ GLOBALS而var_dump工作,var_export会落在它的肚子上.
不适用于包含对自身的引用的变量.var_export不像var_dump那样工作; 像这样,$ v = []; $ v [] =&$ v; var_export($ v,true); ...
**停止向**人发脾气.`var_export`实际上不适合调试,因为你无法对浏览器搜索`(int)`或(string)`等等.它还会将很多信息分解成一个小空间,只需尝试:`var_export( ''); var_export( '\'');`.最重要的是,为***PHP致命错误做好准备:**[嵌套级别太深 - 递归依赖?在第75行的C:\ path\file.php*](http://stackoverflow.com/q/5039431/632951#comment-5643967)

2> Eran Galperi..:

使用输出缓冲:



@Inwdr我只使用var_dump作为调试的便利功能,并且肯定从未在生产代码中留下var_dump语句.我想这是典型的.在这种情况下,绩效不太可能完全相关.
对于这个问题,这是一个很好的字面答案,因为你"将var_dump的结果捕获到一个字符串"就像所要求的那样.var_export()在精神上是一个更好的答案,因为它通常更有意义.
使用输出缓冲很可能会对性能产生负面影响.如果您需要在执行复杂脚本期间查看多个变量,它也会变得非常混乱.
是的,但在某些情况下,这是你唯一能做的事情
为什么这么多投票?var_export更好。

3> Ian P..:

你也可以这样做:

$dump = print_r($variable, true);


我特意提到了var_dump虽然:)
我个人更喜欢在可能的地方使用`print_r`,但遗憾的是有时候它没有提供足够的信息.例如,因为它可以转换为字符串,所以`false`和`null`都显示为空字符串.如果我关心它们之间的区别,我会不情愿地使用`var_dump`或`var_export`.
他从未指定过对象.

4> Sergey Stoly..:

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


一句警告 - 如果您希望输出为字符串的原因是`error_log`它,则不应使用此解决方案,因为serialize的输出可以包含空字节和`error_log` [截断包含空字节的字符串](https: //bugs.php.net/bug.php?id=64439).

5> hanshenrik..:
function return_var_dump(){
    // It works like var_dump, but it 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();
}


-1; 你所做的就是在你之前5年发布一个答案并把它放到一个函数中.
@MarkAmery似乎是真的.我只是轻松了.

6> ZurabWeb..:

echo json_encode($dataobject);可能有帮助


Mark Biek没有说调试,是吗?也许他只需要保存在DB中的对象.在这种情况下,我提供的方法会很好.感谢无论如何,TomášZato.

7> 小智..:

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

从PHP手册:

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

所以,这是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 '';
}

干杯.



8> selfawaresou..:

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



9> Khandad Niaz..:

以下是作为功能的完整解决方案:

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


-1; 您所要做的就是将比您早5年发布的答案放入功能中。
不能使用超过1个变量... var_dump(“ foo”,“ bar”)=>字符串(3)“ foo”字符串(3)“ bar” varDumpToString(“ foo”,“ bar”)=> string(3)“ foo”
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有