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

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

Документация PHP гласит:

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

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

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

Ответ 1

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

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>

Ответ 2

Попробуйте 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* при столкновении с круговыми ссылками.

Ответ 3

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

$dump = print_r($variable, true);

Ответ 4

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

Ответ 5

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();
}

Ответ 6

Также возможно echo json_encode($dataobject);

Ответ 7

Из руководства по 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 '';
}

Ответ 8

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

Ответ 9

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

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}

Ответ 10

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

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

fwrite(fopen('php://stdout', 'w'), var_export($object, true));

Ответ 11

Мне действительно нравится подробный вывод 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, ['=&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)

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

Ответ 12

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

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

Ответ 13

Из 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
}