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.
Utiliser la mise en mémoire tampon de sortie:
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
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);
_
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 ).
_$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);
_
$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,
)
_
$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
}
_
$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] =>
)
_
var_export
_ ne gère pas les références circulairesSi 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.
Vous pouvez aussi faire ceci:
$dump = print_r($variable, true);
Vous pouvez également essayer d'utiliser la fonction serialize()
. Parfois, il est très utile pour le débogage.
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();
}
Aussi echo json_encode($dataobject);
pourrait être utile
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 '';
}
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.
Voici la solution complète en fonction:
function varDumpToString ($var)
{
ob_start();
var_dump($var);
return ob_get_clean();
}
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));
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, ['=>' => '=>']));
}
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.