Как я могу записать результат var_dump в строку? - PullRequest
560 голосов
/ 26 сентября 2008

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

Документы PHP говорят;

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

Может кто-нибудь привести пример того, как это может работать?

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

Ответы [ 12 ]

810 голосов
/ 26 сентября 2008

Попробуйте 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 (но может не дать вам столько информации о переменной, особенно если вы работаете с resources ).

Демо-версия:

$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* при обнаружении циклических ссылок.

557 голосов
/ 26 сентября 2008

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

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
68 голосов
/ 26 сентября 2008

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

$dump = print_r($variable, true);
15 голосов
/ 29 сентября 2008

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

13 голосов
/ 10 ноября 2013
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();
}
12 голосов
/ 06 августа 2013

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

7 голосов
/ 14 сентября 2014

Я знаю, что этот вопрос старый, но никто не упомянул об этом.

Из руководства по PHP :

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

Итак, вот real возвращаемая версия 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 '';
}

Приветствие.

5 голосов
/ 27 декабря 2009

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

4 голосов
/ 13 октября 2013

вот полное решение как функция.

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
2 голосов
/ 02 мая 2018

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

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

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