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



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



PHP docs говорят;




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




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



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

702   11  

11 ответов:

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

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

попробовать 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 возвращает a "разборное строковое представление переменной" пока var_dump просто выводит информацию о переменной. На практике это означает, что var_export дает вам действительный PHP-код (но может не дать вам столько информации о переменной, особенно если вы работаете с ресурсы).

Demo:

$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,
)

вложенностями ($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* при столкновении с круговыми ссылками.

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

$dump = print_r($variable, true);

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

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

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

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

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

Ура.

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

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

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

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

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

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

от 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
}

Comments

    Ничего не найдено.