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

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

В документации PHP сказано:

As with anything that outputs its result directly to the browser, the output-control functions can be used to capture the output of this function, and save it in a string (for example).

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
621
0
360 845
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

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

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

selfawaresoup 27.12.2009 19:45

@Inwdr Я когда-либо использовал var_dump только как удобную функцию для отладки и, конечно же, никогда не оставлял операторы var_dump в производственном коде. Думаю, это типично. В таких обстоятельствах производительность вряд ли вообще будет иметь значение.

Mark Amery 28.02.2013 13:50

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

Anil 10.10.2013 13:31

Это хороший дословный ответ на вопрос, поскольку вы «записываете [записываете] результат var_dump в строку» в точности так, как было задано. var_export () - лучший ответ по духу, так как в целом имеет больше смысла.

Josh from Qaribou 06.06.2014 22:17

@AlbertHendriks Ну, строго говоря, вопрос касается функции с именем var_dump. Мы оба знаем, что var_export лучше, но, поскольку пользователь не знал об этом, когда спрашивал, мы находимся в этой точке. Как видите, ответ ниже с var_export получил гораздо больше голосов. Эта ситуация настолько типична во многих других сценариях, потому что обычно люди не знают, что нужно спрашивать лучше, или придают большее значение тому, что они делают, чем тому, что им нужно ... но что ж, обучение созданию объектов не повредит вам ( другие) так много, и вы увидите правильный ответ ниже по той же цене :-)

m3nda 28.09.2016 07:29

@AlbertHendriks Я предпочитаю var_dump. С включенным Xdebug вы получаете красивое отображение данных.

robsch 27.01.2017 13:36

Это идеальный ответ. Ответ var_export многословен и неуместен, поскольку он не использует ни var_dump, ни захват вывода, а var_export, как и print_r, не дает типов.

webb 24.12.2019 02:53

Даже документация PHP var_dump рекомендует захватывать строку с помощью элементов управления выводом.

Karan Sharma 03.05.2020 21:30

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

$dump = print_r($variable, true);

Я специально упомянул var_dump :)

Mark Biek 26.09.2008 17:35

Лично я предпочитаю использовать print_r там, где это возможно, но, к сожалению, иногда он не предоставляет достаточно информации. Например, поскольку он преобразуется в строку там, где это возможно, как false, так и null отображаются как пустая строка. В тех случаях, когда меня волнует разница между ними, я неохотно прибегаю к var_dump или var_export.

JMTyler 25.01.2013 02:19

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

Спасибо! Раньше использовался print_r, но это лучше для отладки. error_log (var_export ($ var, true)); Все, что тебе нужно! :)

BaronVonKaneHoffen 04.12.2012 23:55

Это определенно лучший ответ, чем принятый. Я удивлен, что голосов за него больше нет! Не могли бы вы пояснить, почему он может не предоставить всю информацию, которую он ищет?

JMTyler 25.01.2013 02:20

@JMTyler var_export возвращает строку разборчивый - по сути PHP-код - в то время как var_dump предоставляет необработанный дамп данных. Так, например, если вы вызываете var_dump для целого числа со значением 1, он напечатает int(1), а var_export просто распечатает 1.

inxilpro 22.06.2013 01:56

var_export падает на живот, если вы используете его с $ GLOBALS, пока работает var_dump.

Olaf 11.12.2013 18:46

не будет работать с переменными, содержащими ссылки на себя .. var_export не работает как var_dump; вот так: $ v = []; $ v [] = & $ v; var_export ($ v, true); ...

hanshenrik 19.01.2014 13:57
Прекратить шумиху people. var_export isn't actually better for debugging because you couldn't do a browser search for (int) or (string)` and etc. It also mangles alot of information into a small space, just try: var_export(''); var_export('\'');. And most importantly, get ready for Неустранимая ошибка PHP:Уровень вложенности слишком глубокий - рекурсивная зависимость? в C: \ path \ file.php в строке 75
Pacerier 25.03.2015 18:12

@Pacerier Для меня первый момент - это преимущество. Думаю, дело в предпочтениях. Тем не менее, проблема с круговой ссылкой - хороший момент. Я добавил комментарий об этом к своему ответу.

inxilpro 25.03.2015 20:25

+1 @Pacerier, этот ответ хуже, потому что он заменяет основной вопрос «как записать результат в строку» на «как сбрасывать переменные другим способом»

vladkras 12.05.2016 11:42

Это определенно худший ответ. OP почти наверняка спрашивал о var_dump, а не о print_r, потому что var_dump дает информацию о типе, а print_r и var_export - нет. Этот ответ также запутывает воду, используя имена типов в качестве имен ключей, непреднамеренно создавая впечатление (по крайней мере, на первый взгляд), как будто var_export действительно предоставляет информацию о типе. ИМО это вводит в заблуждение, не отвечает на OP и должно иметь <0 голосов.

webb 24.12.2019 02:44

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

Предупреждение: если вы хотите выводить строку в виде строки для error_log, вам не следует использовать это решение, поскольку вывод сериализации может содержать нулевые байты и error_logобрезает строки, содержащие нулевые байты.

Mark Amery 25.08.2014 14:21

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

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

В этом случае вывод очень сбивает с толку и, на мой взгляд, далек от цели отладки.

Tomáš Zato - Reinstate Monica 22.08.2013 15:45

Марк Биек ничего не сказал об отладке, не так ли? Может, ему просто нужен объект, сохраненный в БД. В этом случае предложенный мной метод сработает. В любом случае спасибо за внимание, Томаш Зато.

ZurabWeb 29.08.2013 19:16

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

Tomáš Zato - Reinstate Monica 29.08.2013 19:32

Хорошо, я объясню это еще раз. ОТ заявил, что ему нужен выход var_dump. Он также заявил, что print_R предоставляет недостаточную информацию для его нужд. Нет никакой реальной разницы в информации, предоставляемой json_encode и print_r - отличается только формат данных. Учитывая это, если print_r недостаточно, то и json_encode будет недостаточным. Пожалуйста, не жалуйтесь больше на отрицательный голос. Очевидно, это был не просто случайный щелчок, так что разберитесь с этим.

Tomáš Zato - Reinstate Monica 29.08.2013 20:57

Вот полное решение в виде функции:

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

не будет работать с более чем одной переменной ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => строка (3) "foo"

hanshenrik 19.01.2014 13:51

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

@MarkAmery Кажется, правда. Я просто упростил это.

hanshenrik 13.11.2014 06:18

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

This function displays structured information about one or more expressions that includes its type and value.

Итак, вот версия возврата настоящий 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 за настоящий ответ на актуальный вопрос. Я читаю это, потому что мне нужен var_dump, а не var_export, print_r, serialize, json_encode или настоящий отладчик. Я тоже умею ими пользоваться. ОП попросил var_dump, мне нужен var_dump. Спасибо!

Slashback 21.01.2015 22:51

если вы хотите остаться верным var_dump, вы должны trigger_error («Неверное количество параметров для var_dump_str ()»); когда argc <= 0; или еще лучше, пусть var_dump сделает это за вас. :п

hanshenrik 30.01.2015 01:12

Это почти ничего не добавляет, чего еще не было в принятом ответе. Проверка $argc здесь не нужна и, возможно, неверна, как указано @hanshenrik, и как только вы уберете это, все, что вы действительно добавляете, - это вызовы call_user_func_array и func_get_args.

Mark Amery 30.01.2016 15:42

От http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.html:

var_dump and print_r functions can only output directly to browser. So the output of these functions can only retrieved by using output control functions of php. Below method may be useful to save the output.

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
}

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

Mark Amery 30.01.2016 15:46

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

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

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

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

hanshenrik 04.02.2019 03:49

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

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

Хотя это было полезно, я не нашел в существующих ответах ясного и простого решения для преобразования цветного вывода var_dump() в удобочитаемый вывод в строку без тегов html, включая все детали из var_dump().

Обратите внимание: если у вас цветной var_dump(), это означает, что у вас установлен Xdebug, который переопределяет var_dump() по умолчанию php для добавления цветов 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)

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

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

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

Другие вопросы по теме