Я хотел бы записать вывод 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
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
@Inwdr Я когда-либо использовал var_dump только как удобную функцию для отладки и, конечно же, никогда не оставлял операторы var_dump в производственном коде. Думаю, это типично. В таких обстоятельствах производительность вряд ли вообще будет иметь значение.
также удалите теги для удобства чтения (если вам просто нужна строка), используя strip_tags(), это просто вернет тип и значение.
Это хороший дословный ответ на вопрос, поскольку вы «записываете [записываете] результат var_dump в строку» в точности так, как было задано. var_export () - лучший ответ по духу, так как в целом имеет больше смысла.
@AlbertHendriks Ну, строго говоря, вопрос касается функции с именем var_dump. Мы оба знаем, что var_export лучше, но, поскольку пользователь не знал об этом, когда спрашивал, мы находимся в этой точке. Как видите, ответ ниже с var_export получил гораздо больше голосов. Эта ситуация настолько типична во многих других сценариях, потому что обычно люди не знают, что нужно спрашивать лучше, или придают большее значение тому, что они делают, чем тому, что им нужно ... но что ж, обучение созданию объектов не повредит вам ( другие) так много, и вы увидите правильный ответ ниже по той же цене :-)
@AlbertHendriks Я предпочитаю var_dump. С включенным Xdebug вы получаете красивое отображение данных.
Это идеальный ответ. Ответ var_export многословен и неуместен, поскольку он не использует ни var_dump, ни захват вывода, а var_export, как и print_r, не дает типов.
Даже документация PHP var_dump рекомендует захватывать строку с помощью элементов управления выводом.
Вы также можете сделать это:
$dump = print_r($variable, true);
Я специально упомянул var_dump :)
Лично я предпочитаю использовать print_r там, где это возможно, но, к сожалению, иногда он не предоставляет достаточно информации. Например, поскольку он преобразуется в строку там, где это возможно, как false, так и null отображаются как пустая строка. В тех случаях, когда меня волнует разница между ними, я неохотно прибегаю к var_dump или var_export.
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);
$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,
)
$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
}
$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)); Все, что тебе нужно! :)
Это определенно лучший ответ, чем принятый. Я удивлен, что голосов за него больше нет! Не могли бы вы пояснить, почему он может не предоставить всю информацию, которую он ищет?
@JMTyler var_export возвращает строку разборчивый - по сути PHP-код - в то время как var_dump предоставляет необработанный дамп данных. Так, например, если вы вызываете var_dump для целого числа со значением 1, он напечатает int(1), а var_export просто распечатает 1.
var_export падает на живот, если вы используете его с $ GLOBALS, пока работает var_dump.
не будет работать с переменными, содержащими ссылки на себя .. var_export не работает как var_dump; вот так: $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
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 Для меня первый момент - это преимущество. Думаю, дело в предпочтениях. Тем не менее, проблема с круговой ссылкой - хороший момент. Я добавил комментарий об этом к своему ответу.
+1 @Pacerier, этот ответ хуже, потому что он заменяет основной вопрос «как записать результат в строку» на «как сбрасывать переменные другим способом»
Это определенно худший ответ. OP почти наверняка спрашивал о var_dump, а не о print_r, потому что var_dump дает информацию о типе, а print_r и var_export - нет. Этот ответ также запутывает воду, используя имена типов в качестве имен ключей, непреднамеренно создавая впечатление (по крайней мере, на первый взгляд), как будто var_export действительно предоставляет информацию о типе. ИМО это вводит в заблуждение, не отвечает на OP и должно иметь <0 голосов.
Вы также можете попробовать использовать функцию serialize(). Иногда это очень полезно для отладки.
Предупреждение: если вы хотите выводить строку в виде строки для error_log, вам не следует использовать это решение, поскольку вывод сериализации может содержать нулевые байты и error_logобрезает строки, содержащие нулевые байты.
Если вы хотите просмотреть содержимое переменной во время выполнения, рассмотрите возможность использования настоящего отладчика, такого как XDebug. Таким образом, вам не нужно портить исходный код, и вы можете использовать отладчик, даже когда обычные пользователи посещают ваше приложение. Они не заметят.
Также echo json_encode($dataobject); может быть полезным
В этом случае вывод очень сбивает с толку и, на мой взгляд, далек от цели отладки.
Марк Биек ничего не сказал об отладке, не так ли? Может, ему просто нужен объект, сохраненный в БД. В этом случае предложенный мной метод сработает. В любом случае спасибо за внимание, Томаш Зато.
В любом случае json_encode не будет содержать всех данных, которые есть в var_dump (например, в виде типов переменных). json_encode выводит ту же информацию, что и print_R, только в другом формате.
Хорошо, я объясню это еще раз. ОТ заявил, что ему нужен выход var_dump. Он также заявил, что print_R предоставляет недостаточную информацию для его нужд. Нет никакой реальной разницы в информации, предоставляемой json_encode и print_r - отличается только формат данных. Учитывая это, если print_r недостаточно, то и json_encode будет недостаточным. Пожалуйста, не жалуйтесь больше на отрицательный голос. Очевидно, это был не просто случайный щелчок, так что разберитесь с этим.
Вот полное решение в виде функции:
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"
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 Кажется, правда. Я просто упростил это.
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. Спасибо!
если вы хотите остаться верным var_dump, вы должны trigger_error («Неверное количество параметров для var_dump_str ()»); когда argc <= 0; или еще лучше, пусть var_dump сделает это за вас. :п
Это почти ничего не добавляет, чего еще не было в принятом ответе. Проверка $argc здесь не нужна и, возможно, неверна, как указано @hanshenrik, и как только вы уберете это, все, что вы действительно добавляете, - это вызовы call_user_func_array и func_get_args.
От 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 }
Пожалуйста, правильно указывайте, когда вы цитируете материал из другого источника. Перед редактированием, которое я собираюсь внести, единственная часть этого ответа, отформатированная как цитата, - это часть, которую вы не сделал копируете и вставляете из чьего-то блога.
Это может быть немного не по теме.
Я искал способ записать такую информацию в журнал 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);
Мне очень нравится подробный вывод 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, ['=>' => '=>']));
}
Возвращает красивую строку ниже:
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>);'
Использование буферизации вывода, скорее всего, отрицательно повлияет на производительность. Это также может стать очень запутанным, если вам нужно посмотреть на несколько переменных во время выполнения сложного скрипта.