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
返回一个"可解析的变量字符串表示",而 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);
$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,
)
$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
}
$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_dump
和 print_r
遇到循环引用时会输出字符串 *RECURSION*
。
int(1)
,而 var_export 只会打印出 1
。 - inxilprovar_export
并不是更好的调试工具,因为你无法在浏览器中搜索 (int)
或 (string)
等内容。它还会把大量信息混杂在一个小空间内,你可以试试这个命令:var_export(''); var_export('\'');
。最重要的是,准备好迎接致命错误:*PHP Fatal error: Nesting level too deep - recursive dependency? in C:\path\file.php on line 75*。 - Pacerier使用输出缓冲:
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
var_export
的答案冗长而无关紧要,因为它既不使用var_dump
也不使用输出捕获,并且var_export
和print_r
一样都不提供类型信息。 - webb你也可以这样做:
$dump = print_r($variable, true);
print_r
,但不幸的是有时它无法提供足够的信息。例如,由于它会在可能的情况下转换为字符串,因此false
和null
都显示为空字符串。在我关心它们之间区别的情况下,我会勉强使用var_dump
或var_export
。 - JMTyler如果您使用的是 PHP > = 7.0.0
function return_var_dump(...$args): string
{
ob_start();
try {
var_dump(...$args);
return ob_get_clean();
} catch (\Throwable $ex) {
// PHP8 ArgumentCountError for 0 arguments, probably..
// in php<8 this was just a warning
ob_end_clean();
throw $ex;
}
}
或者如果您正在使用的是 PHP >=5.3.0:
function return_var_dump(){
ob_start();
call_user_func_array('var_dump', func_get_args());
return ob_get_clean();
}
或者如果您使用的是PHP<5.3.0(这个函数实际上向后兼容到PHP4)
function return_var_dump(){
$args = func_get_args(); // For <5.3.0 support ...
ob_start();
call_user_func_array('var_dump', $args);
return ob_get_clean();
}
在5.3.0版本之前,如果直接将func_get_args用作另一个函数调用的参数,会存在一个bug,因此您必须将其放入变量中并使用该变量,而不是直接将其用作参数。
function vardump(...$args){if(count($args)){ob_start();var_dump(...$args);return ob_get_clean();}return '';}
PHP5.6+ function vardump(...$args){if(count($args)){ob_start();var_dump(...$args);return ob_get_clean();}return '';}
- a55function vardump(...$args){if(count($args)){ob_start();var_dump(...$args);return ob_get_clean();}else{trigger_error("vardump() 至少需要一个参数,但没有给出。",E_USER_ERROR);return "";}}
- 对于 PHP<8,当您给 var_dump() 0 个参数时,它会触发一个错误,因此当没有参数时,您的 vardump 应该做同样的事情。但如果您使用的是 PHP>=8,则会抛出 ArgumentCountError 异常,因此您的 vardump() 在 php>=8 中也应该做同样的事情。 - hanshenrik另外,echo json_encode($dataobject);
可能会有所帮助。
json_encode
不会包含 var_dump
所有的数据(例如变量类型)。json_encode
输出与 print_R
相同的信息,只是格式不同。 - Tomáš Zatovar_dump
的输出结果。他还表示 print_R
提供的信息不足以满足他的需求。json_encode
和 print_r
提供的信息没有实质性的区别,只是数据格式不同。鉴于此,如果 print_r
不够用,那么 json_encode
也是如此。请不要再抱怨关于投票的事情了。显然这不是随意点击,所以请接受它。 - Tomáš Zato您也可以尝试使用serialize()
函数,有时它对于调试非常有用。
error_log
,则不应使用此解决方案,因为serialize的输出可能包含空字节,而error_log
会截断包含空字节的字符串。 - Mark AmeryPHP手册中提到:
此函数显示有关一个或多个表达式的结构化信息,包括其类型和值。
因此,这里是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 '';
}
$argc
检查是不必要的,而且可以说是错误的,正如 @hanshenrik 指出的那样,一旦你去掉它,你真正添加的只是 call_user_func_array
和 func_get_args
调用。 - Mark Amery如果您想在运行时查看变量的内容,考虑使用真正的调试器,例如XDebug。这样您就不需要破坏源代码,并且即使在普通用户访问您的应用程序时,您也可以使用调试器。他们不会注意到。
以下是完整的函数解决方案:
function varDumpToString ($var)
{
ob_start();
var_dump($var);
return ob_get_clean();
}
这可能有些跑题。
我正在寻找一种方法,将这种信息写入我的PHP-FPM容器的Docker日志,并想出了下面的片段。我相信这可以被Docker PHP-FPM用户使用。
fwrite(fopen('php://stdout', 'w'), var_export($object, true));
file_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
。 - hanshenrik