641 votes

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

J'aimerais capturer la sortie de var_dump à une chaîne de caractères.

La documentation PHP dit ;

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

Quel serait un exemple de la manière dont cela pourrait fonctionner ?

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

918voto

inxilpro Points 3475

Essayez var_export

Vous pouvez consulter var_export - alors qu'il ne fournit pas la même sortie que var_dump il fournit une deuxième $return qui lui fera renvoyer sa sortie plutôt que de l'imprimer :

$debug = var_export($my_var, true);

¿Por qué?

Je préfère cette ligne unique à l'utilisation de ob_start y ob_get_clean() . Je trouve également que le résultat est un peu plus facile à lire, puisqu'il s'agit simplement de code PHP.

La différence entre var_dump y var_export c'est que var_export renvoie un "représentation de la chaîne de caractères d'une variable" tandis que var_dump fournit simplement des informations sur une variable. En pratique, cela signifie que var_export vous donne un code PHP valide (mais peut ne pas vous donner autant d'informations sur la variable, en particulier si vous travaillez avec le langage ressources ).

Démonstration :

$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 rendement :

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] => 
)

Attention : var_export ne gère pas les références circulaires

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

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

Résultats dans :

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

Les deux sites var_dump y print_r d'autre part, produira la chaîne de caractères suivante *RECURSION* lorsque vous rencontrez des références circulaires.

0 votes

Merci ! J'avais l'habitude d'utiliser print_r, mais ceci est bien mieux pour le débogage. error_log(var_export($var, true)) ; Tout ce dont vous avez besoin ! :)

11 votes

C'est définitivement une meilleure réponse que celle qui a été acceptée. Je suis surpris qu'elle n'ait pas plus de votes positifs ! Pourriez-vous expliquer pourquoi elle ne donne pas toutes les informations qu'il recherche ?

7 votes

@JMTyler var_export renvoie un analysable string - 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 de valeur 1, il affichera int(1) alors que var_export ne fait qu'imprimer 1 .

639voto

Eran Galperin Points 49594

Utilisez la mise en mémoire tampon de sortie :

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

9 votes

L'utilisation de la mise en tampon de la sortie aura très probablement un effet négatif sur les performances ici. Cela peut aussi devenir vraiment désordonné si vous avez besoin de regarder plusieurs variables pendant l'exécution d'un script complexe.

84 votes

@Inwdr Je n'ai jamais utilisé var_dump que comme une fonctionnalité pratique pour le 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 un facteur important.

0 votes

Supprimer également les balises pour plus de lisibilité (si vous ne voulez que la chaîne de caractères), en utilisant la méthode suivante strip_tags() ce qui renvoie simplement le type et la valeur.

80voto

Ian P Points 7930

Vous pouvez aussi faire ça :

$dump = print_r($variable, true);

17 votes

J'ai mentionné spécifiquement var_dump cependant :)

7 votes

Je préfère personnellement utiliser print_r quand je le peux, mais malheureusement, parfois, cela ne fournit pas assez d'informations. Par exemple, étant donné qu'il convertit en chaîne de caractères quand il le peut, les deux éléments false y null s'affiche comme une chaîne vide. Dans les cas où je me soucie de la différence entre les deux, j'ai recours à contrecœur à var_dump o var_export .

17voto

Robert Kokuti Points 184
$dump = var_export($obj, true);

15voto

Sergey Stolyarov Points 1388

Vous pouvez également essayer d'utiliser le serialize() fonction. Elle est parfois très utile à des fins de débogage.

7 votes

Un mot d'avertissement - si la raison pour laquelle vous voulez que la sortie soit une chaîne de caractères est de error_log vous ne devriez pas utiliser cette solution, car la sortie de serialize peut contenir des octets nuls et des error_log tronque les chaînes de caractères contenant des octets nuls .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X