Comment puis-je capturer le résultat de var_dump dans une chaîne?

605

Je voudrais capturer la sortie de var_dump dans une chaîne.

La documentation PHP dit;

Comme pour tout ce qui produit son résultat directement dans le navigateur, les fonctions de contrôle de sortie peuvent être utilisées pour capturer la sortie de cette fonction et l'enregistrer dans une chaîne (par exemple).

Quel serait un exemple de la façon dont cela pourrait fonctionner?

print_r() n'est pas une possibilité valable, car cela ne me donnera pas les informations dont j'ai besoin.

Mark Biek
la source

Réponses:

601

Utilisez la mise en mémoire tampon de sortie:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Eran Galperin
la source
8
L'utilisation de la mise en mémoire tampon de sortie aura très probablement un effet négatif sur les performances ici. Il peut également devenir très compliqué si vous avez besoin de regarder plusieurs variables lors de l'exécution d'un script complexe.
selfawaresoup
83
@Inwdr Je n'ai jamais utilisé var_dump comme fonctionnalité de débogage et je n'ai certainement jamais laissé d'instructions var_dump dans le code de production. J'imagine que c'est typique. Dans ces circonstances, il est peu probable que les performances soient pertinentes.
Mark Amery
supprimez également les balises pour la lisibilité (si vous voulez juste la chaîne), en utilisant strip_tags(), cela retournera simplement le type et la valeur.
Anil
11
C'est une bonne réponse littérale à la question, car vous «capturez [le] résultat d'un var_dump vers une chaîne» exactement comme ce qui a été demandé. var_export () est une meilleure réponse dans l'esprit, car elle est plus logique en général.
Josh de Qaribou
1
@AlbertHendriks Je préfère var_dump. Avec Xdebug activé, vous obtenez un joli affichage des données.
robsch
880

Essayer var_export

Vous voudrez peut-être vérifier var_export- alors qu'il ne fournit pas la même sortie var_dumpqu'il ne fournit un deuxième $returnparamètre qui le fera retourner sa sortie plutôt que de l'imprimer:

$debug = var_export($my_var, true);

Pourquoi?

Je préfère cette doublure à l'utilisation ob_startetob_get_clean() . Je trouve également que la sortie est un peu plus facile à lire, car ce n'est que du code PHP.

La différence entre var_dumpet var_exportest que var_exportrenvoie un "représentation sous forme de chaîne analysable d'une variable" tout en vidantvar_dump simplement les informations sur une variable. Dans la pratique, cela signifie que cela var_exportvous donne du code PHP valide (mais peut ne pas vous donner autant d'informations sur la variable, surtout si vous travaillez avec des ressources ).

Démo:

$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 différence de sortie:

var_export ($debug_export dans l'exemple ci-dessus):

 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 dans l'exemple ci-dessus):

 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 dans l'exemple ci-dessus):

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

    [object] => stdClass Object
        (
        )

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

Avertissement: var_exportne gère pas les références circulaires

Si vous essayez de vider une variable avec des références circulaires, appelez var_export entraînera un avertissement PHP:

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

Résulte en:

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

Les deux var_dumpet print_r, d'autre part, sortiront la chaîne *RECURSION*lorsqu'ils rencontreront des références circulaires.

inxilpro
la source
11
C'est certainement une meilleure réponse que celle acceptée. Je suis surpris qu'il n'y ait pas plus de votes positifs! Pourriez-vous nous expliquer pourquoi il ne donne pas toutes les informations qu'il recherche?
JMTyler
7
@JMTyler var_export renvoie une chaîne analysable - essentiellement du code PHP - tandis que var_dump fournit un vidage brut des données. Ainsi, par exemple, si vous appelez var_dump sur un entier avec la valeur 1, il s'imprime int(1)tandis que var_export s'imprime 1.
inxilpro
4
var_export atterrit sur son ventre si vous l'utilisez avec $ GLOBALS pendant que var_dump fonctionne.
Olaf
3
ne fonctionnera pas avec des variables contenant des références à lui-même. var_export ne fonctionne pas comme var_dump; comme ceci, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
hanshenrik
3
Arrêtez d'hyping les gens. var_exportest pas vraiment mieux pour le débogage parce que vous ne pouvez faire une recherche de navigateur pour (int)ou (string) `etc Il a également Mangles beaucoup d'informations dans un petit espace, juste essayer: var_export(''); var_export('\'');. Et surtout, préparez-vous à l' erreur fatale de PHP: niveau d'imbrication trop profond - dépendance récursive? dans C: \ path \ file.php sur la ligne 75
Pacerier
76

Vous pouvez également faire ceci:

$dump = print_r($variable, true);
Ian P
la source
17
J'ai mentionné spécifiquement var_dump cependant :)
Mark Biek
7
Personnellement, je préfère utiliser print_roù je peux, mais malheureusement, il ne fournit parfois pas suffisamment d'informations. Par exemple, puisqu'il transforme en chaîne là où il le peut, les deux falseet nulls'affichent comme une chaîne vide. Dans les cas où je me soucie de la différence entre ceux-ci, je recourrais à contrecœur à var_dumpou var_export.
JMTyler
15

Vous pouvez également essayer d'utiliser la serialize()fonction. Parfois, il est très utile à des fins de débogage.

Sergey Stolyarov
la source
7
Un mot d'avertissement - si la raison pour laquelle vous voulez que la sortie soit une chaîne est error_logcelle-ci, vous ne devriez pas utiliser cette solution, car la sortie de sérialiser peut contenir des octets nuls et error_log tronquer des chaînes contenant des octets nuls .
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
la source
4
@MarkAmery Semble vrai. Je viens de faciliter les choses.
hanshenrik
13

Peut également echo json_encode($dataobject);être utile

ZurabWeb
la source
1
Dans ce cas, la sortie est très confuse et loin de l'objectif de débogage à mon avis.
Tomáš Zato - Rétablir Monica
2
Mark Biek n'a rien dit sur le débogage, n'est-ce pas? Peut-être qu'il a juste besoin d'un objet enregistré dans la base de données. Dans ce cas, ma méthode proposée fonctionnerait bien. Merci pour l'avertissement de toute façon, Tomáš Zato.
ZurabWeb
Quoi qu'il en soit, json_encodene contiendra pas toutes les données var_dump(comme les types de variables par exemple). affiche json_encodeles mêmes informations que print_Rinly dans un format différent.
Tomáš Zato - Rétablir Monica
1
Ok, je vais l'expliquer une fois de plus . L'ergothérapeute a déclaré qu'il avait besoin d'une sortie de var_dump. Il a également déclaré que ces print_Rinformations étaient insuffisantes pour ses besoins. Il n'y a pas de réelle différence dans les informations fournies par json_encodeet print_r- seul le format des données est différent. Compte tenu de cela, si print_rest insuffisant, il en est de même json_encode. Veuillez ne plus vous plaindre du downvote. Ce n'était évidemment pas un simple clic aléatoire, alors faites-le.
Tomáš Zato - Rétablir Monica
9

Depuis le manuel PHP :

Cette fonction affiche des informations structurées sur une ou plusieurs expressions qui incluent son type et sa valeur.

Voici donc la vraie version de retour de PHP var_dump(), qui accepte en fait une liste d'arguments de longueur variable:

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
la source
1
+1 pour avoir fourni la vraie réponse à la question réelle. Je lis ceci parce que j'ai besoin de var_dump, pas var_export, print_r, serialize, json_encode ou un vrai débogueur. Je sais aussi comment les utiliser. OP a demandé var_dump, j'ai besoin de var_dump. Je vous remercie!
Slashback
si vous voulez rester fidèle à var_dump, vous devez trigger_error ("Nombre de paramètres incorrect pour var_dump_str ()"); lorsque argc <= 0; ou mieux encore, demandez à var_dump de le faire pour vous. : p
hanshenrik
Cela n'ajoute pratiquement rien qui n'était pas déjà dans la réponse acceptée. La $argcvérification ici est inutile et sans doute incorrecte comme l'a souligné @hanshenrik, et une fois que vous enlevez cela, tout ce que vous ajoutez est les appels call_user_func_arrayet func_get_args.
Mark Amery
5

Si vous voulez voir le contenu d'une variable pendant l'exécution, pensez à utiliser un vrai débogueur comme XDebug. De cette façon, vous n'avez pas besoin de gâcher votre code source et vous pouvez utiliser un débogueur même lorsque des utilisateurs normaux visitent votre application. Ils ne le remarqueront pas.

selfawaresoup
la source
5

Voici la solution complète en fonction:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
Khandad Niazi
la source
2
ne fonctionnera pas avec plus d'une variable ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik
2

C'est peut-être un peu hors sujet.

Je cherchais un moyen d'écrire ce type d'informations dans le journal Docker de mon conteneur PHP-FPM et j'ai trouvé l'extrait ci-dessous. Je suis sûr que cela peut être utilisé par les utilisateurs Docker PHP-FPM.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Charlie Vieillard
la source
1
le handle n'est jamais fermé, il s'agit donc d'une fuite de ressources, ce qui peut être un problème dans les scripts de style démon de longue durée. mais essayezfile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik
0

J'aime vraiment var_dump()la sortie verbeuse de et je n'étais pas satisfaite de var_export()la print_r()sortie de ou parce qu'elle ne donnait pas autant d'informations (par exemple, type de données manquant, longueur manquante).

Pour écrire du code sécurisé et prévisible, il est parfois utile de faire la différence entre une chaîne vide et une valeur nulle. Ou entre un 1 et un vrai. Ou entre un nul et un faux. Je veux donc mon type de données dans la sortie.

Bien qu'utile, je n'ai pas trouvé de solution propre et simple dans les réponses existantes pour convertir la sortie colorée de var_dump()en une sortie lisible par l'homme en une chaîne sans les balises html et incluant tous les détails de var_dump().

Notez que si vous avez une couleur var_dump(), cela signifie que vous avez installé Xdebug qui remplace la valeur par défaut de php var_dump()pour ajouter des couleurs html.

Pour cette raison, j'ai créé cette légère variation donnant exactement ce dont j'ai besoin:

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

Renvoie la jolie chaîne ci-dessous:

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)

J'espère que cela aide quelqu'un.

Wadih M.
la source
-2

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

Les fonctions var_dump et print_r peuvent uniquement sortir directement vers le navigateur. Ainsi, la sortie de ces fonctions ne peut être récupérée qu'en utilisant les fonctions de contrôle de sortie de php. La méthode ci-dessous peut être utile pour enregistrer la sortie.

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

ob_get_clean () ne peut effacer que les dernières données entrées dans le tampon interne. La méthode ob_get_contents sera donc utile si vous avez plusieurs entrées.

De la même source que ci-dessus:

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
la source
1
Veuillez indiquer correctement lorsque vous citez du matériel provenant d'une autre source. Avant la modification que je m'apprête à faire, la seule partie de cette réponse formatée en citation est la partie que vous n'avez pas copiée et collée à partir du blog de quelqu'un.
Mark Amery
-2

Longue chaîne : utilisez simplement echo($var);au lieu de dump($var);.

Objet ou tableau :var_dump('<pre>'.json_encode($var).'</pre>);'

vuchkov
la source