Як я можу зафіксувати результат var_dump до рядка?


605

Я хотів би зафіксувати вихідний var_dumpрядок.

Документація PHP говорить;

Як і в усьому, що виводить його результат безпосередньо в браузер, функції керування виведеннями можна використовувати для збору результатів цієї функції та збереження їх у рядку (наприклад).

Що може бути прикладом того, як це могло б працювати?

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

Відповіді:


601

Використовувати вихідну буферизацію:

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

8
Використання вихідної буферизації, швидше за все, негативно вплине на продуктивність тут. Він також може стати справді безладним, якщо вам потрібно переглянути кілька змінних під час виконання складного сценарію.
selfawaresoup

83
@Inwdr Я тільки коли-небудь використовував var_dump як зручну функцію для налагодження, і, звичайно, ніколи не залишав var_dump заяви у виробничому коді. Я думаю, це типово. За таких обставин результативність роботи навряд чи буде актуальною.
Марк Амері

також видаліть теги для читабельності (якщо ви просто хочете рядок), використовуючи strip_tags(), це просто поверне тип і значення.
Аніль

11
Це хороша буквальна відповідь на запитання, оскільки ви "захоплюєте [результат] результату var_dump до рядка" точно так, як було запропоновано. var_export () - краща відповідь духом, оскільки це має більше сенсу в цілому.
Джош із Карібу

1
@AlbertHendriks Я віддаю перевагу var_dump. Якщо Xdebug увімкнено, ви отримуєте неабиякі дані.
robsch

880

Спробуйте 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] => 
)

Caveat: 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*при зустрічі з круговими посиланнями.


11
Це, безумовно, краща відповідь, ніж прийнята. Я здивований, що в ньому немає більше подій! Не могли б ви детальніше пояснити, чому він може не дати всієї інформації, яку він шукає?
JMTyler

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

4
var_export приземляється на животі, якщо ви використовуєте його з $ GLOBALS, коли var_dump працює.
Олаф

3
не працюватиме зі змінними, що містять посилання на себе. var_export не працює як var_dump; так, $ v = []; $ v [] = & $ v; var_export ($ v, вірно); ...
hanshenrik

3
Перестаньте обробляти людей. var_exportНЕ на самом деле краще для налагодження , тому що ви не можете зробити пошук для браузера (int)або (рядок) `і т.д. Він також Mangles багато інформації в невеликому просторі, просто спробуйте: var_export(''); var_export('\'');. І найголовніше, будьте готові до PHP фатальної помилки: рівень гніздування занадто глибокий - рекурсивна залежність? в C: \ path \ file.php по рядку 75
Pacerier

76

Ви також можете зробити це:

$dump = print_r($variable, true);

17
Хоча я спеціально згадував var_dump :)
Марк Бік,

7
Я особисто вважаю за краще використовувати print_rтам, де можу, але, на жаль, іноді це не дає достатньо інформації. Наприклад, оскільки він передає рядок, де він може, falseі nullвідображати як порожній рядок. У тих випадках, коли я дбаю про різницю між ними, я б з грубою вдачею вдався до var_dumpабо var_export.
JMTyler

15

Ви також можете спробувати скористатися serialize()функцією. Іноді це дуже корисно для налагодження.


7
Слово попередження - якщо ви хочете, щоб результат виводився як рядок error_log, вам не слід використовувати це рішення, оскільки вихідний сигнал серіалізації може містити нульові байти та error_log обрізки рядків, що містять нульові байти .
Марк Амері

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

4
@MarkAmery Здається, що це правда. Я просто зробив це легко.
hanshenrik

13

Також echo json_encode($dataobject);може бути корисно


1
У цьому випадку результат є дуже заплутаним та далеко на меті налагодження, на мою думку.
Томаш Зато - Відновити Моніку

2
Марк Бік нічого не сказав про налагодження, чи не так? Можливо, йому просто потрібен об'єкт, збережений у БД. У цьому випадку мій запропонований метод спрацював би добре. Спасибі за голову в будь-якому випадку, Томаш Зато.
ZurabWeb

У будь-якому випадку, json_encodeне буде містити всі дані var_dump(наприклад, такі як змінні типи). json_encodeвиводить ту саму інформацію, що і print_R, inly, в іншому форматі.
Томаш Зато - Відновити Моніку

1
Гаразд, я ще раз поясню це . ВЗ заявив, що йому потрібен вихід var_dump. Він також заявив, що print_Rнадає недостатню інформацію для своїх потреб. Немає реальної різниці в інформації, яка надається json_encodeі print_r- лише формат даних відрізняється. З огляду на це, якщо print_rнедостатньо, так і є json_encode. Будь ласка, більше не нарікайте на скоромовки. Очевидно, це було не просто випадкове клацання, тому розбирайтеся з цим.
Томаш Зато - Відновити Моніку

9

З посібника 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 '';
}

1
+1 за надання реального відповіді на власне питання. Я читаю це, тому що мені потрібен var_dump, а не var_export, print_r, serialize, json_encode чи справжній налагоджувач. Я також знаю, як їх використовувати. ОП просив var_dump, мені потрібен var_dump. Дякую!
Slashback

якщо ви хочете залишатись вірним var_dump, ви повинні запустити_error ("Неправильний підрахунок параметрів для var_dump_str ()"); коли argc <= 0; а ще краще, щоб var_dump зробив це за вас. : p
hanshenrik

Це додає майже нічого, що вже не було у прийнятій відповіді. $argcЧек тут не потрібно , і , можливо , неправильно , як вказував @hanshenrik, і як тільки ви віднімеш все , що ви на самому справі є додавання call_user_func_arrayі func_get_argsвиклики.
Марк Амері

5

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


5

Ось повне рішення як функція:

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

2
не працюватиме з більш ніж 1 змінною ... var_dump ("foo", "bar") => рядок (3) "foo" рядок (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik

2

Це, можливо, трохи поза темою.

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

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

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

0

Мені дуже подобається var_dump()багатослівний вихід 'і не був задоволений результатом var_export()' s або print_r()', тому що він не дав стільки інформації (наприклад, тип даних відсутній, відсутність довжини).

Щоб написати захищений і передбачуваний код, іноді корисно розмежовувати порожній рядок і нульовий. Або між 1 і правдою. Або між нульовим і хибним. Тому я хочу, щоб мій тип даних був у висновку.

Хоча це було корисно, я не знайшов чистого та простого рішення у існуючих відповідях для перетворення кольорового виводу з 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)

Сподіваюся, це комусь допоможе.


-2

З 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
}

1
Будь ласка, належним чином вкажіть, коли ви цитуєте матеріал з іншого джерела. Перед редагуванням, яке я збираюся зробити, єдиною частиною цієї відповіді, форматованою як цитата, є частина, яку ви не копіювали та не вставляли з чийогось блогу.
Марк Амері

-2

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

Об'єкт або масив :var_dump('<pre>'.json_encode($var).'</pre>);'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.