Wie kann ich das Ergebnis von var_dump in einem String erfassen?

605

Ich möchte die Ausgabe var_dumpeines Strings erfassen .

Die PHP-Dokumentation sagt;

Wie bei allem, was das Ergebnis direkt an den Browser ausgibt, können die Ausgabesteuerungsfunktionen verwendet werden, um die Ausgabe dieser Funktion zu erfassen und in einer Zeichenfolge zu speichern (zum Beispiel).

Was wäre ein Beispiel dafür, wie das funktionieren könnte?

print_r() ist keine gültige Möglichkeit, da sie mir nicht die Informationen gibt, die ich brauche.

Mark Biek
quelle

Antworten:

601

Verwenden Sie die Ausgabepufferung:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Eran Galperin
quelle
8
Die Verwendung der Ausgabepufferung wirkt sich hier höchstwahrscheinlich negativ auf die Leistung aus. Es kann auch sehr chaotisch werden, wenn Sie während der Ausführung eines komplexen Skripts mehrere Variablen betrachten müssen.
Selfawaresoup
83
@Inwdr Ich habe var_dump bisher nur als praktische Funktion zum Debuggen verwendet und sicherlich nie var_dump-Anweisungen im Produktionscode hinterlassen. Ich stelle mir das typisch vor. Unter diesen Umständen ist es unwahrscheinlich, dass die Leistung überhaupt relevant ist.
Mark Amery
Entfernen Sie auch die Tags aus Gründen der Lesbarkeit (wenn Sie nur die Zeichenfolge möchten). Dadurch strip_tags()werden einfach der Typ und der Wert zurückgegeben.
Anil
11
Dies ist eine gute wörtliche Antwort auf die Frage, da Sie das Ergebnis eines var_dump in einen String genau so erfassen, wie es gestellt wurde. var_export () ist eine bessere Antwort im Geiste, da es allgemein sinnvoller ist.
Josh aus Qaribou
1
@ AlbertHendriks Ich bevorzuge var_dump. Wenn Xdebug aktiviert ist, werden hübsche Daten angezeigt.
Robsch
880

Versuchen var_export

Vielleicht möchten Sie auschecken var_export- obwohl es nicht die gleiche Ausgabe var_dumpliefert wie einen zweiten $returnParameter, der dazu führt, dass es seine Ausgabe zurückgibt, anstatt sie zu drucken:

$debug = var_export($my_var, true);

Warum?

Ich bevorzuge diesen Einzeiler gegenüber ob_startund ob_get_clean(). Ich finde auch, dass die Ausgabe etwas einfacher zu lesen ist, da es sich nur um PHP-Code handelt.

Der Unterschied zwischen var_dumpund var_exportbesteht darin, dass var_exporteine "analysierbare Zeichenfolgendarstellung einer Variablen" zurückgegeben wird, während var_dumpeinfach Informationen über eine Variable ausgegeben werden. In der Praxis bedeutet dies, dass var_exportSie gültigen PHP-Code erhalten (möglicherweise jedoch nicht so viele Informationen über die Variable erhalten, insbesondere wenn Sie mit Ressourcen arbeiten ).

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

Der Unterschied in der Leistung:

var_export ( $debug_exportim obigen Beispiel):

 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_dumpim obigen Beispiel):

 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_printrim obigen Beispiel):

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

    [object] => stdClass Object
        (
        )

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

Vorsichtsmaßnahme: var_exportBehandelt keine Zirkelverweise

Wenn Sie versuchen, eine Variable mit Zirkelverweisen zu sichern, führt der Aufruf var_exportzu einer PHP-Warnung:

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

Ergebnisse in:

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

Beide var_dumpund geben print_randererseits die Zeichenfolge aus, *RECURSION*wenn auf Zirkelverweise gestoßen wird.

inxilpro
quelle
11
Dies ist definitiv eine bessere Antwort als die akzeptierte. Ich bin überrascht, dass es keine Upvotes mehr gibt! Könnten Sie näher erläutern, warum möglicherweise nicht alle Informationen angezeigt werden, nach denen er sucht?
JMTyler
7
@JMTyler var_export gibt eine analysierbare Zeichenfolge zurück - im Wesentlichen PHP-Code -, während var_dump einen Rohspeicherauszug der Daten bereitstellt. Wenn Sie beispielsweise var_dump für eine Ganzzahl mit dem Wert 1 int(1)aufrufen , wird diese gedruckt, während var_export nur gedruckt wird 1.
Inxilpro
4
var_export landet auf seinem Bauch, wenn Sie es mit $ GLOBALS verwenden, während var_dump funktioniert.
Olaf
3
funktioniert nicht mit Variablen, die Verweise auf sich selbst enthalten. var_export funktioniert nicht wie var_dump. so ist $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
Hanshenrik
3
Hör auf, Leute zu hypen . var_exportist eigentlich nicht besser zum Debuggen, weil Sie keine Browsersuche nach (int)oder (Zeichenfolge) `usw. durchführen konnten. Außerdem werden viele Informationen auf kleinem Raum zusammengefasst. Versuchen Sie einfach : var_export(''); var_export('\'');. Und vor allem : Machen Sie sich bereit für einen schwerwiegenden PHP-Fehler: Verschachtelungsebene zu tief - rekursive Abhängigkeit? in C: \ path \ file.php in Zeile 75
Pacerier
76

Sie können dies auch tun:

$dump = print_r($variable, true);
Ian P.
quelle
17
Ich habe var_dump jedoch ausdrücklich erwähnt :)
Mark Biek
7
Ich persönlich bevorzuge es zu verwenden, print_rwo ich kann, aber leider liefert es manchmal nicht genug Informationen. Zum Beispiel, da es in eine Zeichenfolge umgewandelt wird, wo es kann, beide falseund nullals leere Zeichenfolge angezeigt. In Fällen, in denen mir der Unterschied zwischen diesen wichtig ist, würde ich widerwillig auf var_dumpoder zurückgreifen var_export.
JMTyler
15

Sie können auch versuchen, die serialize()Funktion zu verwenden. Manchmal ist es sehr nützlich für Debugging-Zwecke.

Sergey Stolyarov
quelle
7
Ein Wort der Warnung: Wenn Sie die Ausgabe als Zeichenfolge verwenden möchten error_log, sollten Sie diese Lösung nicht verwenden, da die Ausgabe von serialize Null-Bytes enthalten und error_log Zeichenfolgen mit Null-Bytes abschneiden kann .
Mark Amery
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();
}
hanshenrik
quelle
4
@ MarkAmery Scheint wahr. Ich habe es einfach gemacht.
Hanshenrik
13

Auch echo json_encode($dataobject);könnte hilfreich sein ,

ZurabWeb
quelle
1
In diesem Fall ist die Ausgabe meiner Meinung nach sehr verwirrend und weit entfernt vom Debug-Zweck.
Tomáš Zato - Wiedereinsetzung Monica
2
Mark Biek hat nichts über das Debuggen gesagt, oder? Vielleicht braucht er nur ein Objekt, das in der Datenbank gespeichert ist. In diesem Fall würde meine angebotene Methode gut funktionieren. Trotzdem danke für das Heads-up, Tomáš Zato.
ZurabWeb
Auf json_encodejeden var_dumpFall werden nicht alle Daten enthalten (z. B. als Variablentypen). json_encodegibt die gleichen Informationen aus print_R, nur in unterschiedlichem Format.
Tomáš Zato - Wiedereinsetzung Monica
1
Ok, ich werde es noch einmal erklären . Der OT gab an, dass er eine Ausgabe von benötigt var_dump. Er erklärte auch, dass print_Res nicht genügend Informationen für seine Bedürfnisse gibt. Es gibt keinen wirklichen Unterschied in den Informationen, die von json_encodeund bereitgestellt werden print_r- nur das Datenformat ist unterschiedlich. Wenn dies print_rnicht ausreicht, ist dies auch der Fall json_encode. Bitte beschweren Sie sich nicht mehr über die Ablehnung. Es war offensichtlich nicht nur ein zufälliger Klick, also kümmere dich darum.
Tomáš Zato - Wiedereinsetzung Monica
9

Aus dem PHP-Handbuch :

Diese Funktion zeigt strukturierte Informationen zu einem oder mehreren Ausdrücken an, einschließlich Typ und Wert.

Hier ist also die echte Rückgabeversion von PHPs var_dump(), die tatsächlich eine Argumentliste mit variabler Länge akzeptiert:

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 '';
}
Younis Bensalah
quelle
1
+1 für die echte Antwort auf die eigentliche Frage. Ich lese das, weil ich var_dump brauche, nicht var_export, print_r, serialize, json_encode oder einen echten Debugger. Ich weiß auch, wie man diese benutzt. OP fragte nach var_dump, ich brauche var_dump. Vielen Dank!
Slashback
Wenn Sie var_dump treu bleiben möchten, müssen Sie trigger_error ("Falsche Parameteranzahl für var_dump_str ()") auslösen. wenn argc <= 0; oder noch besser, lassen Sie var_dump das für Sie tun. : p
Hanshenrik
Dies fügt so ziemlich nichts hinzu, was nicht bereits in der akzeptierten Antwort enthalten war. Die $argcÜberprüfung hier ist unnötig und wohl falsch, wie von @hanshenrik hervorgehoben, und sobald Sie das wegnehmen, fügen Sie nur noch die call_user_func_arrayund func_get_args-Aufrufe hinzu.
Mark Amery
5

Wenn Sie sich zur Laufzeit den Inhalt einer Variablen ansehen möchten, sollten Sie einen echten Debugger wie XDebug verwenden. Auf diese Weise müssen Sie Ihren Quellcode nicht durcheinander bringen und können einen Debugger verwenden, auch wenn normale Benutzer Ihre Anwendung besuchen. Sie werden es nicht bemerken.

selfawaresoup
quelle
5

Hier ist die Komplettlösung als Funktion:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
Khandad Niazi
quelle
2
funktioniert nicht mit mehr als 1 Variablen ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik
2

Dies ist vielleicht ein bisschen vom Thema entfernt.

Ich suchte nach einer Möglichkeit, diese Art von Informationen in das Docker-Protokoll meines PHP-FPM-Containers zu schreiben, und fand das folgende Snippet. Ich bin sicher, dass dies von Docker PHP-FPM-Benutzern verwendet werden kann.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Charlie Vieillard
quelle
1
Das Handle wird nie geschlossen, daher handelt es sich um ein Ressourcenleck, das bei lang laufenden Skripten im Daemon-Stil ein Problem darstellen kann. aber versuchen Siefile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
Hanshenrik
0

Ich mag var_dump()die ausführliche Ausgabe sehr und war mit der Ausgabe von oder nicht zufrieden var_export(), print_r()weil sie nicht so viele Informationen lieferte (z. B. fehlender Datentyp, fehlende Länge).

Um sicheren und vorhersehbaren Code zu schreiben, ist es manchmal nützlich, zwischen einer leeren Zeichenfolge und einer Null zu unterscheiden. Oder zwischen einer 1 und einer wahren. Oder zwischen null und falsch. Also möchte ich meinen Datentyp in der Ausgabe haben.

Obwohl hilfreich, habe ich in den vorhandenen Antworten keine saubere und einfache Lösung gefunden, um die farbige Ausgabe von var_dump()in eine für Menschen lesbare Ausgabe in eine Zeichenfolge ohne die HTML-Tags und mit allen Details von umzuwandeln var_dump().

Beachten Sie, dass wenn Sie eine Farbe haben var_dump(), dies bedeutet, dass Sie Xdebug installiert haben, das die Standardeinstellung var_dump()von PHP zum Hinzufügen von HTML-Farben überschreibt .

Aus diesem Grund habe ich diese kleine Variation erstellt, die genau das bietet, was ich brauche:

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

Gibt die folgende schöne Zeichenfolge zurück:

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)

Hoffe es hilft jemandem.

Wadih M.
quelle
-2

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

Die Funktionen var_dump und print_r können nur direkt im Browser ausgegeben werden. Die Ausgabe dieser Funktionen kann also nur mithilfe der Ausgabesteuerungsfunktionen von PHP abgerufen werden. Die folgende Methode kann nützlich sein, um die Ausgabe zu speichern.

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

ob_get_clean () kann nur die zuletzt in den internen Puffer eingegebenen Daten löschen. Die Methode ob_get_contents ist daher nützlich, wenn Sie mehrere Einträge haben.

Aus derselben Quelle wie oben:

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
}
Dev C.
quelle
1
Bitte geben Sie richtig an, wenn Sie Material aus einer anderen Quelle zitieren. Vor der Bearbeitung, die ich vornehmen werde, ist der einzige Teil dieser Antwort, der als Zitat formatiert ist, der Teil, den Sie nicht aus einem Blog von jemandem kopiert und eingefügt haben.
Mark Amery
-2

Lange Schnur : Verwenden Sie einfach echo($var);anstelle von dump($var);.

Objekt oder Array :var_dump('<pre>'.json_encode($var).'</pre>);'

vuchkov
quelle