我怎样才能捕获到一个stringvar_dump的结果?
我想捕获var_dump
的输出到一个string。
PHP文档说,
与任何将结果直接输出到浏览器的情况一样, 输出控制函数可用于捕获此函数的输出,并将其保存为string(例如)。
有人能给我一个例子,说明如何工作?
print_r()
不是一个有效的可能性,因为它不会给我所需要的信息。
使用输出缓冲:
<?php ob_start(); var_dump($someVar); $result = ob_get_clean(); ?>
尝试var_export
你可能想要检查一下var_export
– 虽然它不提供与var_dump
相同的输出,但是它提供了第二个$return
参数,这将导致它返回它的输出而不是打印它:
$debug = var_export($my_var, true);
为什么?
我更喜欢使用ob_start
和ob_get_clean()
。 我也发现输出有点容易阅读,因为它只是PHP代码。
var_dump
和var_export
之间的区别在于, var_export
返回“variables的可分析string表示”,而var_dump
只是简单地转储有关variables的信息。 这在实践中意味着var_export
为您提供了有效的PHP代码(但是可能无法提供有关该variables的更多信息,特别是在使用资源时 )。
演示:
$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
不处理循环引用
如果您正尝试转储具有循环引用的variables,则调用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_dump
和print_r
将输出string*RECURSION*
。
你也可以这样做:
$dump = print_r($variable, true);
你也可以尝试使用serialize()
函数,有时对于debuggingpuprposes非常有用。
还echo json_encode($dataobject);
可能会有帮助
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(); }
如果您想在运行时查看variables内容,请考虑使用像XDebug这样的真正的debugging器。 这样你就不需要弄乱你的源代码,甚至在普通用户访问你的应用程序时也可以使用debugging器。 他们不会注意到。
我知道这个问题很老,但没有人提到这一点。
从PHP手册 :
此function显示关于一个或多个expression式的结构化信息,包括其types和值。
所以,这里是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 ''; }
干杯。
这里是作为function的完整解决scheme。
function varDumpToString ($var) { ob_start(); var_dump($var); return ob_get_clean(); }
从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($object); $result = ob_get_clean(); return $result; }
ob_get_clean()只能清除input到内部缓冲区的最后一个数据。 所以如果你有多个条目,ob_get_contents方法将会很有用。
从上面的同一来源:
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 }