我想将var_dump的输出捕获到一个字符串 .
PHP文档说;
与将结果直接输出到浏览器的任何内容一样,输出控制函数可用于捕获此函数的输出,并将其保存在字符串中(例如) .
有人能给我一个如何运作的例子吗?
print_r() isn 't a valid possibility because it'不会给我提供我需要的信息 .
print_r()
您也可以尝试使用serialize()函数,有时它对于调试puprposes非常有用 .
如果您想在运行时查看变量内容,请考虑使用像XDebug这样的实际调试器 . 这样您就不需要弄乱源代码,即使普通用户访问您的应用程序,也可以使用调试器 . 他们不会注意到 .
您可能想要查看var_export - 虽然它没有提供与 var_dump 相同的输出,但它确实提供了第二个 $return 参数,这将导致它返回其输出而不是打印它:
var_dump
$return
$debug = var_export($my_var, true);
我更喜欢这种单行使用 ob_start 和 ob_get_clean() . 我还发现输出更容易阅读,因为它只是PHP代码 .
ob_start
ob_get_clean()
var_dump 和 var_export 之间的区别在于 var_export 返回"parsable string representation of a variable"而 var_dump 只是转储有关变量的信息 . 这在实践中意味着 var_export 为您提供了有效的PHP代码(但可能无法提供有关该变量的更多信息,特别是如果您正在使用resources) .
var_export
$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);
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, )
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 将导致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 在遇到循环引用时将输出字符串 *RECURSION* .
print_r
*RECURSION*
另外 echo json_encode($dataobject); 可能会有所帮助
echo json_encode($dataobject);
我知道这个问题很老,但是没有人提到这一点 .
来自PHP manual:
此函数显示有关包含其类型和值的一个或多个表达式的结构化信息 .
所以,这是PHP的 var_dump() 的实际返回版本,它实际上接受一个可变长度的参数列表 .
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 ''; }
干杯 .
使用输出缓冲:
<?php ob_start(); var_dump($someVar); $result = ob_get_clean(); ?>
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(); }
来自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}
这是功能完整的解决方案 .
function varDumpToString ($var) { ob_start(); var_dump($var); return ob_get_clean(); }
你也可以这样做:
$dump = print_r($variable, true);
这可能有点偏离主题 .
我正在寻找一种方法将这种信息写入我的PHP-FPM容器的Docker日志,并提出了下面的代码片段 . 我确信这可以被Docker PHP-FPM用户使用 .
fwrite(fopen('php://stdout', 'w'), var_export($object, true));
11 回答
您也可以尝试使用serialize()函数,有时它对于调试puprposes非常有用 .
如果您想在运行时查看变量内容,请考虑使用像XDebug这样的实际调试器 . 这样您就不需要弄乱源代码,即使普通用户访问您的应用程序,也可以使用调试器 . 他们不会注意到 .
尝试var_export
您可能想要查看var_export - 虽然它没有提供与
var_dump
相同的输出,但它确实提供了第二个$return
参数,这将导致它返回其输出而不是打印它:为什么?
我更喜欢这种单行使用
ob_start
和ob_get_clean()
. 我还发现输出更容易阅读,因为它只是PHP代码 .var_dump
和var_export
之间的区别在于var_export
返回"parsable string representation of a variable"而var_dump
只是转储有关变量的信息 . 这在实践中意味着var_export
为您提供了有效的PHP代码(但可能无法提供有关该变量的更多信息,特别是如果您正在使用resources) .演示:
输出的差异:
var_export(上例中为$ debug_export):
var_dump(上例中为$ debug_dump):
print_r(上例中为$ debug_printr):
警告:var_export不处理循环引用
如果您尝试使用循环引用转储变量,则调用
var_export
将导致PHP警告:结果是:
另一方面,
var_dump
和print_r
在遇到循环引用时将输出字符串*RECURSION*
.另外
echo json_encode($dataobject);
可能会有所帮助我知道这个问题很老,但是没有人提到这一点 .
来自PHP manual:
所以,这是PHP的
var_dump()
的实际返回版本,它实际上接受一个可变长度的参数列表 .干杯 .
使用输出缓冲:
来自http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.html:
ob_get_clean()只能清除输入到内部缓冲区的最后数据 . 因此,如果您有多个条目,ob_get_contents方法将非常有用 .
来自上面的相同来源:
这是功能完整的解决方案 .
你也可以这样做:
这可能有点偏离主题 .
我正在寻找一种方法将这种信息写入我的PHP-FPM容器的Docker日志,并提出了下面的代码片段 . 我确信这可以被Docker PHP-FPM用户使用 .