Come posso catturare il risultato di var_dump su una stringa?


605

Vorrei catturare l'output di var_dump una stringa.

La documentazione di PHP dice;

Come per qualsiasi cosa che trasmetta il suo risultato direttamente al browser, le funzioni di controllo dell'output possono essere utilizzate per catturare l'output di questa funzione e salvarlo in una stringa (ad esempio).

Quale sarebbe un esempio di come potrebbe funzionare?

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

Risposte:


601

Usa buffer di output:

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

8
L'uso del buffering dell'output avrà probabilmente un effetto negativo sulle prestazioni qui. Inoltre, può diventare davvero disordinato se è necessario esaminare più variabili durante l'esecuzione di uno script complesso.
selfawaresoup,

83
@Inwdr Ho sempre usato var_dump come funzione di praticità per il debug e certamente non ho mai lasciato le istruzioni var_dump nel codice di produzione. Immagino che questo sia tipico. In tali circostanze, è improbabile che le prestazioni siano affatto pertinenti.
Mark Amery,

rimuovi anche i tag per leggibilità (se vuoi solo la stringa), usando strip_tags(), questo restituirà semplicemente il tipo e il valore.
Anil,

11
Questa è una buona risposta letterale alla domanda, dato che stai 'captur [ing] il risultato di un var_dump in una stringa' esattamente come quello che ti è stato chiesto. var_export () è una risposta migliore nello spirito, poiché in genere ha più senso.
Josh di Qaribou,

1
@AlbertHendriks Preferisco var_dump. Con Xdebug abilitato ottieni una bella visualizzazione dei dati.
robsch,

880

Provare var_export

Potresti voler dare un'occhiata var_export- sebbene non fornisca lo stesso output in var_dumpquanto fornisce un secondo $returnparametro che gli farà restituire il suo output piuttosto che stamparlo:

$debug = var_export($my_var, true);

Perché?

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

La differenza tra var_dumpe var_exportè che var_exportrestituisce una "rappresentazione di stringa analizzabile di una variabile" mentre var_dumpscarica semplicemente informazioni su una variabile. Ciò che ciò significa in pratica è che var_exportti fornisce un codice PHP valido (ma potrebbe non fornirti altrettante informazioni sulla variabile, specialmente se stai lavorando con risorse ).

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 nell'output:

var_export ( $debug_exportnell'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_dumpnell'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_printrnell'esempio sopra):

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

    [object] => stdClass Object
        (
        )

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

Avvertenza: var_exportnon gestisce riferimenti circolari

Se stai cercando di scaricare una variabile con riferimenti circolari, la chiamata var_exportcomporterà 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,
   ),
 )

Entrambi var_dumpe print_r, d'altra parte, produrranno la stringa *RECURSION*quando incontreranno riferimenti circolari.


11
Questa è sicuramente una risposta migliore di quella accettata. Sono sorpreso che non abbia più voti! Potresti approfondire il motivo per cui potrebbe non fornire tutte le informazioni che sta cercando?
JMTyler,

7
@JMTyler var_export restituisce una stringa analizzabile , essenzialmente codice PHP, mentre var_dump fornisce un dump non elaborato dei dati. Ad esempio, se si chiama var_dump su un numero intero con il valore 1, verrà stampato int(1)mentre var_export stampa 1.
inxilpro,

4
var_export atterra sulla sua pancia se lo usi con $ GLOBALS mentre var_dump funziona.
Olaf,

3
non funziona con variabili contenenti riferimenti a se stesso .. var_export non funziona come var_dump; in questo modo, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
Hanshenrik,

3
Smettila di esporre le persone. var_exportNon è in realtà migliore per il debug perché non si poteva fare una ricerca del browser per (int)o (stringa) `e ecc anche Mangani un sacco di informazioni in un piccolo spazio, basta provare: var_export(''); var_export('\'');. E, soprattutto, preparatevi per l' errore irreversibile PHP: livello di annidamento troppo profondo - dipendenza ricorsiva? in C: \ path \ file.php sulla linea 75
Pacerier

76

Puoi anche fare questo:

$dump = print_r($variable, true);

17
Ho citato in modo specifico var_dump :)
Mark Biek,

7
Personalmente preferisco usare print_rdove posso, ma sfortunatamente a volte non fornisce abbastanza informazioni. Ad esempio, poiché si lancia in una stringa dove può, sia falsee nullmostra come una stringa vuota. Nei casi in cui mi preoccupo della differenza tra questi, ricorrere a malincuore a var_dumpo var_export.
JMTyler


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 Sembra vero. L'ho appena semplificato.
Hanshenrik,

13

Inoltre echo json_encode($dataobject);potrebbe essere utile


1
In questo caso, l'output è molto confuso e lontano dallo scopo di debug secondo me.
Tomáš Zato - Ripristina Monica il

2
Mark Biek non ha detto nulla sul debug, vero? Forse ha solo bisogno di un oggetto salvato nel DB. In questo caso il mio metodo offerto funzionerebbe bene. Grazie comunque per il testa a testa, Tomáš Zato.
ZurabWeb,

Ad ogni modo, json_encodenon conterrà tutti i dati var_dump(ad esempio come tipi di variabili). json_encodegenera le stesse informazioni print_R, in un formato diverso.
Tomáš Zato - Ripristina Monica il

1
Ok, lo spiegherò ancora una volta . L'OT ha dichiarato di aver bisogno della produzione di var_dump. Ha anche affermato che print_Rfornisce informazioni insufficienti per le sue esigenze. Non vi è alcuna reale differenza nelle informazioni fornite da json_encodee print_r- solo il formato dei dati è diverso. Detto questo, se print_rè insufficiente, lo è anche json_encode. Per favore, non lamentarti più del downvote. Ovviamente non era solo un clic casuale, quindi affrontalo.
Tomáš Zato - Ripristina Monica il

9

Dal manuale di PHP :

Questa funzione visualizza informazioni strutturate su una o più espressioni che ne includono il tipo e il valore.

Quindi, ecco la vera versione di ritorno di PHP var_dump(), che in realtà accetta un elenco di argomenti di lunghezza variabile:

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 per aver fornito la vera risposta alla domanda reale. Sto leggendo questo perché ho bisogno di var_dump, non var_export, print_r, serialize, json_encode o un vero debugger. So usare anche quelli. OP ha chiesto var_dump, ho bisogno di var_dump. Grazie!
Slashback,

se vuoi rimanere fedele a var_dump, devi trigger_error ("Conteggio parametri errato per var_dump_str ()"); quando argc <= 0; o meglio ancora, var_dump lo fa per te. : p
hanshenrik,

Questo aggiunge praticamente nulla che non fosse già nella risposta accettata. Il $argccontrollo qui non è necessario e probabilmente errato, come sottolineato da @hanshenrik, e una volta che lo porti via tutto ciò che stai davvero aggiungendo è il call_user_func_arraye func_get_argschiama.
Mark Amery,

5

Se vuoi dare un'occhiata al contenuto di una variabile durante il runtime, considera l'utilizzo di un vero debugger come XDebug. In questo modo non è necessario incasinare il codice sorgente e utilizzare un debugger anche quando gli utenti normali visitano l'applicazione. Non se ne accorgeranno.


5

Ecco la soluzione completa come funzione:

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

2
non funziona con più di 1 variabile ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik,

2

Questo forse è un po 'fuori tema.

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

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

1
l'handle non viene mai chiuso, quindi si tratta di una perdita di risorse, che può essere un problema negli script di tipo demone di lunga durata. ma provafile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik il

0

Mi piace molto l' var_dump()output dettagliato e non sono soddisfatto dell'output di var_export()'o print_r()' perché non ha fornito quante più informazioni (ad es. Tipo di dati mancante, lunghezza mancante).

Per scrivere codice sicuro e prevedibile, a volte è utile distinguere tra una stringa vuota e una null. O tra un 1 e un vero. O tra un null e un falso. Quindi voglio il mio tipo di dati nell'output.

Sebbene utile, non ho trovato una soluzione pulita e semplice nelle risposte esistenti per convertire l'output colorato di var_dump()un output leggibile dall'uomo in una stringa senza i tag html e includendo tutti i dettagli davar_dump() .

Nota che se hai un colore var_dump(), significa che hai installato Xdebug che sovrascrive il valore predefinito di php var_dump()per aggiungere colori html.

Per questo motivo, ho creato questa leggera variazione dando esattamente ciò di cui ho bisogno:

function dbg_var_dump($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        return strip_tags(strtr($result, ['=&gt;' => '=>']));
    }

Restituisce la seguente stringa piacevole:

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)

Spero che aiuti qualcuno.


-2

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

Le funzioni var_dump e print_r possono essere emesse solo direttamente nel browser. Quindi l'output di queste funzioni può essere recuperato solo usando le funzioni di controllo dell'output di php. Il metodo seguente può essere utile per salvare l'output.

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

ob_get_clean () può cancellare solo gli ultimi dati inseriti nel buffer interno. Quindi il metodo ob_get_contents sarà utile se hai più voci.

Dalla stessa fonte di cui sopra:

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
Indica correttamente quando stai citando materiale da un'altra fonte. Prima della modifica che sto per fare, l'unica parte di questa risposta formattata come una citazione è la parte che non hai copiato e incollato dal blog di qualcuno.
Mark Amery,

-2

Stringa lunga : basta usare echo($var);invece di dump($var);.

Oggetto o matrice :var_dump('<pre>'.json_encode($var).'</pre>);'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.