Как я могу записать результат var_dump в строку?

605

Я хотел бы захватить вывод var_dumpстроки.

Документация PHP говорит;

Как и для всего, что выводит свой результат непосредственно в браузер, функции управления выводом можно использовать для захвата вывода этой функции и сохранения его в виде строки (например).

Что может быть примером того, как это может работать?

print_r() Это недопустимая возможность, потому что она не даст мне ту информацию, которая мне нужна.

Марк Бик
источник

Ответы:

601

Используйте выходную буферизацию:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Эран Гальперин
источник
8
Использование буферизации вывода, скорее всего, отрицательно скажется на производительности. Это также может стать очень запутанным, если вам нужно посмотреть на несколько переменных во время выполнения сложного скрипта.
selfawaresoup
83
@Inwdr Я когда-либо использовал var_dump только для удобства отладки, и, конечно, никогда не оставлял операторов var_dump в производственном коде. Я думаю, это типично. В этих обстоятельствах производительность вряд ли будет вообще актуальна.
Марк Амери
также удалите теги для удобства чтения (если вы просто хотите строку), используя strip_tags(), это просто вернет тип и значение.
Анил
11
Это хороший буквальный ответ на вопрос, поскольку вы «захватываете [результат] var_dump в строку» точно так же, как было задано. var_export () - лучший ответ по духу, так как в целом он имеет больше смысла.
Джош из Карибу
1
@AlbertHendriks Я предпочитаю var_dump. С включенным Xdebug вы получите симпатичное отображение данных.
Робс
880

Пытаться 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);

Разница в выходе:

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_dumpи print_r, с другой стороны, будут выводить строку *RECURSION*при обнаружении циклических ссылок.

inxilpro
источник
11
Это, безусловно, лучший ответ, чем принятый. Я удивлен, что у него нет больше голосов! Не могли бы вы уточнить, почему он может не дать всю информацию, которую он ищет?
JMTyler
7
@JMTyler var_export возвращает интерпретируемое строковое по существу PHP код при var_dump обеспечивает необработанный дамп данных. Так, например, если вы вызываете var_dump для целого числа со значением 1, он будет печататься, int(1)а var_export просто печатает 1.
inxilpro
4
var_export приземляется на живот, если вы используете его с $ GLOBALS, пока работает var_dump.
Олаф
3
не будет работать с переменными, содержащими ссылки на себя .. var_export не работает как var_dump; вот так: $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
Ханшенрик
3
Хватит обманывать людей. var_exportне на самом деле лучше для отладки , потому что вы не можете сделать поиск для браузера (int)или (строка) `и т.д. Он также Mangles много информации в небольшом пространстве, просто попробуйте: var_export(''); var_export('\'');. И самое главное, будьте готовы к PHP Фатальная ошибка: слишком глубокий уровень вложенности - рекурсивная зависимость? в C: \ path \ file.php в строке 75
Pacerier
76

Вы также можете сделать это:

$dump = print_r($variable, true);
Ян П
источник
17
Я специально упомянул var_dump, хотя :)
Марк Биек
7
Я лично предпочитаю использовать, print_rгде могу, но, к сожалению, иногда это не дает достаточно информации. Например, поскольку он преобразуется в строку, где он может, и то falseи другое nullотображается как пустая строка. В тех случаях, когда я беспокоюсь о разнице между ними, я неохотно прибегаю к var_dumpили var_export.
JMTyler
15

Вы также можете попробовать использовать эту serialize()функцию. Иногда это очень полезно для отладки.

Сергей Столяров
источник
7
Слово предупреждения - если причина, по которой вы хотите выводить как строку, к error_logнему, вам не следует использовать это решение, поскольку вывод serialize может содержать нулевые байты и error_log обрезать строки, содержащие нулевые байты .
Марк Амери
15
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();
}
hanshenrik
источник
4
@MarkAmery Кажется, правда. Я просто сделал это легко.
hanshenrik
13

Также echo json_encode($dataobject);может быть полезным

ZurabWeb
источник
1
В этом случае вывод очень запутанный и, на мой взгляд, далек от цели отладки.
Томаш Зато - Восстановить Монику
2
Марк Бик ничего не сказал об отладке? Возможно, ему просто нужен объект, сохраненный в БД. В этом случае мой предложенный метод будет работать хорошо. В любом случае, спасибо за советы, Томаш Зато.
ZurabWeb
В любом случае, json_encodeне будет содержать все данные var_dump(например, типы переменных). json_encodeвыводит ту же информацию, что print_Rи inly в другом формате.
Томаш Зато - Восстановить Монику
1
Хорошо, я объясню это еще раз . ОТ заявил, что ему нужен выход var_dump. Он также заявил, что print_Rпредоставляет недостаточно информации для своих нужд. Нет реальной разницы в информации, которая предоставляется json_encodeи print_r- только формат данных отличается. Учитывая это, если print_rне достаточно, так и есть json_encode. Пожалуйста, не жалуйтесь на понижение больше. Очевидно, это был не случайный клик, так что разберитесь с ним.
Томаш Зато - Восстановить Монику
9

Из руководства по 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 '';
}
Юнис Бенсала
источник
1
+1 за реальный ответ на актуальный вопрос. Я читаю это, потому что мне нужно var_dump, а не var_export, print_r, serialize, json_encode или настоящий отладчик. Я тоже знаю, как их использовать. ОП попросил var_dump, мне нужно var_dump. Спасибо!
Слэшбэк
если вы хотите остаться верным для var_dump, вы должны вызвать trigger_error ("Неверный счетчик параметров для var_dump_str ()"); когда argc <= 0; или еще лучше, пусть var_dump сделает это за вас. : p
hanshenrik
Это практически ничего не добавляет, чего не было в принятом ответе. $argcЧек здесь не требуется , и , возможно , неправильно , как указывал @hanshenrik, и как только вы отнимешь все , что вы на самом деле является добавление call_user_func_arrayи func_get_argsвызовы.
Марк Амери
5

Если вы хотите просмотреть содержимое переменной во время выполнения, подумайте об использовании реального отладчика, такого как XDebug. Таким образом, вам не нужно портить исходный код, и вы можете использовать отладчик, даже когда обычные пользователи посещают ваше приложение. Они не заметят.

selfawaresoup
источник
5

Вот полное решение как функция:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
Хандад Ниази
источник
2
не будет работать с более чем одной переменной ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => Строка (3) "Foo"
Hanshenrik
2

Это может быть немного не по теме.

Я искал способ записать такую ​​информацию в журнал Docker моего контейнера PHP-FPM и придумал приведенный ниже фрагмент. Я уверен, что это может быть использовано пользователями Docker PHP-FPM.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Чарли Вийяр
источник
1
дескриптор никогда не закрывается, так что это утечка ресурсов, которая может быть проблемой в долго работающих скриптах в стиле демона. но попробуйтеfile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik
0

Мне действительно нравятся var_dump()подробные выходные данные и я не был удовлетворен выходными данными var_export()или print_r(), потому что они не давали столько информации (например, отсутствовал тип данных, отсутствовала длина).

Чтобы написать безопасный и предсказуемый код, иногда полезно различать пустую строку и нулевую. Или между 1 и истинным. Или между нулем и ложью. Поэтому я хочу, чтобы мой тип данных в выводе.

Несмотря на полезность, я не нашел в существующих ответах простого и понятного решения для преобразования цветного вывода 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, ['=&gt;' => '=>']));
    }

Возвращает следующую красивую строку:

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)

Надеюсь, это кому-нибудь поможет.

Вадих М.
источник
-2

С 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
}
Dev C
источник
1
Пожалуйста, укажите, когда вы цитируете материал из другого источника. Перед редактированием, которое я собираюсь сделать, единственная часть этого ответа, отформатированная как цитата, - это часть, которую вы не скопировали и не вставили из чьего-то блога.
Марк Амери
-2

Длинная строка : просто используйте echo($var);вместо dump($var);.

Объект или массив :var_dump('<pre>'.json_encode($var).'</pre>);'

vuchkov
источник