10
votes

PHP - Var_Dump non récursif?

Lorsque vous traitez avec certains objets PHP, il est possible de faire un var_dump () et PHP imprime les valeurs à l'écran allant sur et allumé jusqu'à ce que la limite de mémoire PHP soit atteinte, je suppose. Un exemple de ceci est dumping un simple objet HTML DOM. Je suppose que parce que vous êtes capable de traverser les enfants et les parents d'objets, que faire var_dump () donne des résultats infinis car il trouve le parent d'un objet, puis trouve ensuite recroversité ses enfants et trouve ensuite tous ces enfants Parents et trouve ces enfants, etc., etc, etc. Il va simplement continuer.

Ma question est la suivante: Comment pouvez-vous éviter cela et garder PHP de dumping déchaîner de manière récursive les mêmes choses encore et encore? Utilisation de l'exemple simple HTML DOM Parser, si j'ai un objet DOM qui n'a pas d'enfant et i var_dump () it, j'aimerais simplement jeter l'objet et ne commence pas à parcourir l'arbre DOM et des parents dumping, grands-parents, autres enfants, etc.


3 Réponses :


0
votes

Pourquoi n'exécutez-vous pas simplement un foreach en boucle sur votre objet?

du Documents PHP :

La construction de Foreach donne simplement un moyen facile de parcourir des tableaux. foreach ne fonctionne que sur les tableaux ( et objets ), et émettra une erreur Lorsque vous essayez de l'utiliser sur une variable avec un type de données différent ou un variable non initialisée.


6 commentaires

Vraiment? PHP me donne toujours un avis lorsque j'essaie d'envoyer une STDCLASS à foreach. Y a-t-il une limite à quels objets vous pouvez utiliser avec cela?


si-not-true-then-false.com/2009/...


@animuson pouvez-vous coller un exemple de cela? Je n'ai jamais eu un tel problème.


@YODA: Ce n'est que la norme «ARLACH ARLARH TOST ARGUMENT 1 pour être un tableau» ou quoi que ce soit. J'ai toujours dû taper le style STDCLASS à un tableau d'abord, puis envoyez-le à destination de vous débarrasser de l'avis.


Eh bien maintenant que je sais, je vais essayer de trouver où j'avais ce problème dans mon code et postera une question pourquoi cela fait ça ...


foreach "techniquement" veut un tableau. Si vous voulez perdre beaucoup de temps et écrire un mauvais code, allumez les avis.



5
votes

Installez l'extension Xdebug dans votre environnement de développement. Il remplace Var_Dummp avec son propre qui ne va que 3 membres profondément par défaut.

https://xdebug.org/ DOCS / Affichage P>

Il affichera les éléments 4 niveaux profond comme une ellipsie. Vous pouvez modifier la profondeur avec un réglage INI. P>

toutes les fonctions PHP: var_dump, var_export et print_r ne suivent pas les références de récursives / circulaires. P>

EDIT: P>

Si vous voulez le faire de manière difficile, vous pouvez écrire votre propre fonction P>

print_rr($thing, $level=0) {
   if ($level == 4) { return; }
   if (is_object($thing)) {
       $vars = get_object_vars($thing);

   }

   if (is_array($thing)) {
       $vars = $thing;
   }
   if (!$vars) {
       print " $thing \n";
       return;
   }

   foreach ($vars as $k=>$v) {
      if (is_object($v)) return print_rr($v, $level++);
      if (is_array($v)) return print_rr($v, $level++);
      print "something like var_dump, var_export output\n";
   }
}


2 commentaires

Existe-t-il une méthode qui n'implique pas xdebug?


@Nicholasshanks Non non à moins d'écrire votre propre et une profondeur de piste.



0
votes

J'ai eu ce problème et n'avais pas besoin de voir à l'intérieur des objets, juste des noms de classe d'objet, alors j'ai écrit une fonction simple pour remplacer les objets avec leurs noms de classe avant de jeter les données:

var_dump(sanitizeDumpContent($recursive_content))


0 commentaires