[php] Come posso catturare il risultato di var_dump su una stringa?



Answers

Prova var_export

Puoi provare var_export - anche se non fornisce lo stesso output di var_dump , fornisce un secondo parametro $return che farà sì che restituisca il risultato piuttosto che stamparlo:

$debug = var_export($my_var, true);

Perché?

Preferisco questo one-liner all'utilizzo di ob_start e ob_get_clean() . Trovo anche che l'output è un po 'più facile da leggere, dal momento che è solo il codice PHP.

La differenza tra var_dump e var_export è che var_export restituisce una "rappresentazione di stringa parsable di una variabile" mentre var_dump semplicemente scarica informazioni su una variabile. Ciò significa in pratica che var_export ti fornisce un codice PHP valido (ma potrebbe non fornirti altrettante informazioni sulla variabile, specialmente se stai lavorando con le resources ).

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

La differenza di output:

var_export ( $debug_export nell'esempio sopra):

 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 nell'esempio sopra):

 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 nell'esempio sopra):

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

    [object] => stdClass Object
        (
        )

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

var_export : var_export non gestisce riferimenti circolari

Se stai provando a scaricare una variabile con riferimenti circolari, chiamando var_export verrà visualizzato un avviso PHP:

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

Risultati in:

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

Sia var_dump che print_r , d'altra parte, *RECURSION* la stringa *RECURSION* quando incontrano riferimenti circolari.

Question

Mi piacerebbe catturare l'output di var_dump su una stringa.

I documenti PHP dicono;

Come per tutto ciò che produce il risultato direttamente nel browser, è possibile utilizzare le funzioni di controllo dell'output per acquisire l'output di questa funzione e salvarlo in una stringa (ad esempio).

Qualcuno può darmi un esempio di come potrebbe funzionare?

print_r() non è una possibilità valida perché non mi darà le informazioni di cui ho bisogno.




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



Se vuoi dare un'occhiata ai contenuti delle variabili durante il runtime, considera l'uso di un debugger reale come XDebug. In questo modo non hai bisogno di rovinare il tuo codice sorgente e puoi usare un debugger anche mentre i normali utenti visitano la tua applicazione. Non se ne accorgeranno.




Questo forse è un po 'fuori tema.

Stavo cercando un modo per scrivere questo tipo di informazioni nel log Docker del mio contenitore PHP-FPM e ho trovato lo snippet qui sotto. Sono sicuro che questo può essere usato dagli utenti di PHP-FPM di Docker.

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



Puoi anche provare a utilizzare la funzione serialize() , a volte è molto utile per il debug delle puproves.




Links