Jak mogę przechwycić wynik zrzutu var do łańcucha znaków?

Chciałbym uchwycić wyjście z var_dump do sznurka.

Dokumenty PHP mówią;

Podobnie jak w przypadku wszystkiego, co wysyła swój wynik bezpośrednio do przeglądarki, funkcje sterowania wyjściami mogą być używane do przechwytywania wyjścia tej funkcji i zapisywania go w łańcuchu (na przykład).

Czy ktoś może mi podać przykład jak to działa?

print_r() nie jest to ważna możliwość, ponieważ nie da mi informacji, że potrzeba.

Author: William Perron, 2008-09-26

11 answers

Użyj buforowania wyjścia:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
 524
Author: Eran Galperin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 13:25:22

Spróbuj var_export

You may want to check out var_export - chociaż nie dostarcza tego samego wyjścia co var_dump, dostarcza drugi parametr $return, który spowoduje, że zwróci swoje wyjście, zamiast go wydrukować:

$debug = var_export($my_var, true);
Dlaczego?

Wolę ten jednowarstwowy od używania ob_start i ob_get_clean(). Uważam również, że wyjście jest nieco łatwiejsze do odczytania, ponieważ jest to tylko kod PHP.

Różnica między var_dump i var_export jest taka, że var_export zwraca "parsable string representation of a variable" podczas gdy var_dump po prostu zrzuca informacje o zmiennej. W praktyce oznacza to, że var_export daje poprawny kod PHP (ale może nie dawać aż tylu informacji o zmiennej, zwłaszcza jeśli pracujesz z zasobami).

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

Różnica w wyjściu:

Var_export ($debug_export w powyższym przykładzie):

 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 powyżej przykład):

 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 w powyższym przykładzie):

Array
(
    [bool] => 
    [int] => 1
    [float] => 3.14
    [string] => hello world
    [array] => Array
        (
        )

    [object] => stdClass Object
        (
        )

    [resource] => Resource id #4
    [null] => 
)

Zastrzeżenie: var_export nie obsługuje odniesień kołowych

Jeśli próbujesz zrzucić zmienną z okrągłymi referencjami, wywołanie var_export spowoduje Ostrzeżenie PHP:

 $circular = array();
 $circular['self'] =& $circular;
 var_export($circular);

Wyniki w:

 Warning: var_export does not handle circular references in example.php on line 3
 array (
   'self' => 
   array (
     'self' => NULL,
   ),
 )

Zarówno var_dump, jak i print_r, Z drugiej strony, wyświetli łańcuch *RECURSION* W przypadku napotkania odniesień okrągłych.

 756
Author: inxilpro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-24 14:32:21

Możesz też to zrobić:

$dump = print_r($variable, true);
 61
Author: Ian P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 13:27:06

Możesz również spróbować użyć serialize() funkcja, czasami bardzo przydatna do debugowania puprposes.

 15
Author: Sergey Stolyarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 10:19:33

Również echo json_encode($dataobject); może być pomocne

 11
Author: ZurabWeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-06 15:59:46
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();
}
 10
Author: hanshenrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 13:18:24

Wiem, że to pytanie jest stare, ale nikt o tym nie wspomniał.

Z instrukcji PHP:

Ta funkcja wyświetla uporządkowane informacje o jednym lub kilku wyrażeniach, które zawierają jego typ i wartość.

Oto prawdziwa return Wersja var_dump() PHP, która akceptuje listę argumentów o zmiennej długości.

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 '';
}
Zdrówko.
 7
Author: YouniS Bensalah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 16:47:25

Jeśli chcesz przyjrzeć się zawartości zmiennych w czasie wykonywania, rozważ użycie prawdziwego debuggera, takiego jak XDebug. W ten sposób nie musisz mieszać kodu źródłowego i możesz używać debuggera nawet wtedy, gdy normalni użytkownicy odwiedzają Twoją aplikację. Nie zauważą.

 5
Author: selfawaresoup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-27 16:47:29

Oto kompletne rozwiązanie jako funkcja.

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
 3
Author: Khandad Niazi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 11:28:40

To może trochę nie na temat.

Szukałem sposobu na zapisanie tego rodzaju informacji do dziennika dokera mojego kontenera PHP-FPM i znalazłem poniższy fragment. Jestem pewien, że może być używany przez użytkowników Docker PHP-FPM.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
 1
Author: Charlie Vieillard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-02 08:49:55

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

Funkcje Var_dump i print_r mogą wysyłać TYLKO bezpośrednio do przeglądarki. Tak więc wyjście tych funkcji może być pobrane tylko za pomocą funkcji sterowania wyjściowego php. Poniższa metoda może być przydatna do zapisania danych wyjściowych.

function assignVarDumpValueToString($object) {
    ob_start();
    var_dump($object);
    $result = ob_get_clean();
    return $result;
}

Ob_get_clean () może wyczyścić tylko ostatnie dane wprowadzone do wewnętrznego bufora. Więc metoda ob_get_contents będzie przydatna, jeśli masz wiele pozycji.

Z tego samego źródła co wyżej:

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
}
 -2
Author: Dev C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-30 12:48:33