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

462

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

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

Как и все, что выводит результат непосредственно в браузер, функции вывода

Теги:
string
var-dump

10 ответов

451
Лучший ответ

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

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
  • 8
    Использование буферизации вывода, скорее всего, отрицательно скажется на производительности. Это также может стать очень запутанным, если вам нужно посмотреть на несколько переменных во время выполнения сложного скрипта.
  • 6
    да, но в некоторых случаях это единственное, что вы можете сделать
Показать ещё 6 комментариев
643

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

  • 0
    Спасибо! Используется для использования print_r, но это лучше для отладки. error_log (var_export ($ var, true)); Все, что тебе нужно! :)
  • 6
    Это, безусловно, лучший ответ, чем принятый. Я удивлен, что у него нет больше голосов! Не могли бы вы уточнить, почему он может не дать всю информацию, которую он ищет?
Показать ещё 6 комментариев
60

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

$dump = print_r($variable, true);
  • 8
    Не работает для объектов
  • 4
    Он никогда не указывал объекты.
Показать ещё 3 комментария
15

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

  • 6
    Слово предупреждения - если причина, по которой вы хотите выводить в виде строки, заключается в том, что она содержит error_log , вы не должны использовать это решение, поскольку выходные данные serialize могут содержать нулевые байты, а error_log строки, содержащие нулевые байты .
10

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

  • 1
    В этом случае вывод очень запутанный и, на мой взгляд, далек от цели отладки.
  • 2
    Марк Бик ничего не сказал об отладке? Возможно, ему просто нужен объект, сохраненный в БД. В этом случае мой предложенный метод будет работать хорошо. В любом случае, спасибо за советы, Томаш Зато.
Показать ещё 2 комментария
8
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();
}
  • 4
    -1; все, что вы сделали, это взяли ответ, опубликованный за 5 лет до вас, и включили его в работу.
  • 4
    @MarkAmery Кажется, правда. Я просто сделал это легко.
5

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

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

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

  • 0
    Кто-то на самом деле упомянул об этом ...
  • 0
    Работает как шарм!
Показать ещё 3 комментария
5

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

3

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

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"
  • 4
    -1; все, что вы сделали, это взяли ответ, опубликованный за 5 лет до вас, и включили его в работу.
-1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню