web-dev-qa-db-fra.com

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

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

La documentation PHP dit:

Comme pour tout ce qui renvoie directement le résultat au navigateur, les fonctions de contrôle de sortie peuvent être utilisés pour capturer le résultat de cette fonction et le sauvegarder 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 va pas me donner les informations dont j'ai besoin.

571
Mark Biek

Utiliser la mise en mémoire tampon de sortie:

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

Essayez var_export

Vous voudrez peut-être extraire var_export - s'il ne fournit pas le même résultat que _var_dump_, il fournit un deuxième paramètre _$return_ qui le fera renvoyer sa sortie plutôt que de l'imprimer:

_$debug = var_export($my_var, true);
_

Pourquoi?

Je préfère ce one-liner à utiliser _ob_start_ et ob_get_clean(). Je trouve également que la sortie est un peu plus facile à lire, puisqu'il ne s'agit que de code PHP.

La différence entre _var_dump_ et _var_export_ est que _var_export_ renvoie une "représentation de chaîne analysable d'une variable" tant que _var_dump_ vide simplement les informations sur une variable. Cela signifie en pratique que _var_export_ vous donne un code valide PHP (mais peut ne pas vous donner autant d'informations sur la variable, surtout si vous travaillez avec 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_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_ donnera 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,
   ),
 )
_

D'autre part, _var_dump_ et _print_r_ génèrent la chaîne _*RECURSION*_ lorsqu'ils rencontrent des références circulaires.

835
inxilpro

Vous pouvez aussi faire ceci:

$dump = print_r($variable, true);
70
Ian P

Vous pouvez également essayer d'utiliser la fonction serialize() . Parfois, il est très utile pour le débogage.

15
Sergey Stolyarov
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();
}
13
hanshenrik

Aussi echo json_encode($dataobject); pourrait être utile

12
ZurabWeb

À partir du manuel PHP :

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

Donc, voici la version réelle de var_dump() de PHP, qui accepte en réalité 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 '';
}
7
YouniS Bensalah

Si vous souhaitez consulter le contenu d'une variable pendant l'exécution, envisagez d'utiliser un véritable débogueur tel que 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 remarqueront pas.

5
selfawaresoup

Voici la solution complète en fonction:

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

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 de code ci-dessous. Je suis sûr que cela peut être utilisé par les utilisateurs de Docker PHP-FPM.

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

J'aime beaucoup la sortie prolixe de var_dump() et je n'étais pas satisfait de la sortie de var_export() ou print_r() car elle ne donnait pas autant d'informations (type de données manquant, longueur manquante, par exemple).

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 chaîne 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 que utile, je n'ai pas trouvé de solution claire 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 un var_dump() coloré, cela signifie que vous avez installé Xdebug, qui remplace le var_dump() par défaut de php pour ajouter des couleurs html.

C'est pour cette raison que j'ai créé cette légère variation en 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 chaîne ci-dessous Nice:

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 ça aide quelqu'un.

0
Wadih M.