Ответ 1
Использовать буферизацию вывода:
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Я хотел бы захватить вывод var_dump
в строку.
Документация PHP гласит:
Как и все, что выводит свой результат непосредственно в браузер, функции управления выводом можно использовать для захвата вывода этой функции и сохранения его в строке (например).
Что может быть примером того, как это может работать?
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
возвращает "синтаксическое строковое представление переменной", а 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*
при столкновении с круговыми ссылками.
Вы также можете сделать это:
$dump = print_r($variable, true);
Вы также можете попробовать использовать функцию serialize()
. Иногда это очень полезно для отладки.
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();
}
Также возможно echo json_encode($dataobject);
Эта функция отображает структурированную информацию об одном или нескольких выражениях, которая включает его тип и значение.
Итак, вот реальная возвращаемая версия 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 '';
}
Если вы хотите просмотреть содержимое переменной во время выполнения, подумайте об использовании настоящего отладчика, такого как XDebug. Таким образом, вам не нужно портить исходный код, и вы можете использовать отладчик, даже когда обычные пользователи посещают ваше приложение. Они не заметят.
Вот полное решение как функция:
function varDumpToString ($var)
{
ob_start();
var_dump($var);
return ob_get_clean();
}
Это может быть немного не по теме.
Я искал способ записать такую информацию в журнал Docker моего контейнера PHP-FPM и нашел приведенный ниже фрагмент кода. Я уверен, что это может быть использовано пользователями Docker PHP-FPM.
fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Мне действительно нравится подробный вывод var_dump()
и он не был удовлетворен var_export()
или print_r()
потому что он не давал столько информации (например, отсутствует тип данных, отсутствует длина).
Чтобы написать безопасный и предсказуемый код, иногда полезно различать пустую строку и нулевую. Или между 1 и истинным. Или между нулем и ложью. Поэтому я хочу, чтобы мой тип данных в выводе.
Несмотря на свою полезность, я не нашел в существующих ответах простого и var_dump()
решения для преобразования цветного вывода var_dump()
в удобочитаемый вывод в строку без тегов html и включая все детали из var_dump()
.
Обратите внимание, что если у вас есть цветная var_dump()
, это означает, что у вас установлен Xdebug, который переопределяет php по умолчанию var_dump()
для добавления HTML-цветов.
По этой причине я создал небольшое изменение, дающее именно то, что мне нужно:
function dbg_var_dump($var)
{
ob_start();
var_dump($var);
$result = ob_get_clean();
return strip_tags(strtr($result, ['=>' => '=>']));
}
Возвращает следующую красивую строку:
array (size=6)
'functioncall' => string 'add-time-property' (length=17)
'listingid' => string '57' (length=2)
'weekday' => string '0' (length=1)
'starttime' => string '00:00' (length=5)
'endtime' => string '00:00' (length=5)
'price' => string '' (length=0)
Надеюсь, это кому-нибудь поможет.
Длинная строка: просто используйте echo($var);
вместо dump($var);
.
Объект или Массив: var_dump('<pre>'.json_encode($var).'</pre>);'
Из 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() может очищать только последние данные, введенные во внутренний буфер. Так Метод 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 }