EisFuX: Debuggen mit error_reporting(E_ALL)

Beitrag lesen

Hallo dedlfix,

hmm, ... sollte ich schon wieder was überlesen haben? Ich glaubte, auf diesen Satz des Threaderöffners zu antworten:

Gibt es weitere Prüfmethoden für PHP-Code? Z.B. für arrays, variablen und so weiter...

Ich bezog mich also aufs __Prüfen__ und nicht aufs __Anzeigen__ von Variablen-Inhalten oder -Typen ...

var_dump funktioniert auch mit "Einzelvariablen" und ist in der Regel völlig ausreichend.

Ist mir bekannt, das tut print_r() übrigens auch.

Der von debug_zval_dump() zusätzlich ausgegebene Referenzcounter ist in der Regel uninteressant.

Das interessiert mich unter Umständen durchaus. Auch var_dump() weist bei der Ausgabe von Array-Elementen (laut User-Contributions aber nur dort) dezent mit einem "&" vor dem Variablennamen auf einen Referenz-Counter größer als 1 hin ...

Und, um Typen von Variablen zu prüfen:
gettype()
var_dump() zeigt auch den Typ an.

Ja aber nicht den Typ alleine. Wenn ich lediglich __prüfen__ will, ob (m)eine Funktion den richtigen Typ zurückliefert, dann interessiert mich der Inhalt der Variablen eher weniger ...

Auch für Ausdrücke und zum Anzeigen von Funktionsergebnissen lässt sich var_dump() sehr gut verwenden.

Deine Liebe zu var_dump() in allen Ehren, aber eine Funktion, die ihre Ausgaben lediglich in den Ausgabepuffer schreiben kann, ist als Debugging-Hilfe allein ziemlich ungeeignet -- denn in ein Error-Logfile kann man so (ohne Umwege) nicht schreiben. Bliebe noch die Ausgabe im Browser: Dort produziert es in der HTML-Darstellung Buchstabensalat. print_r() kann seine Ausgabe wenigstens in einen String umleiten.

Die erste Maßnahme wäre daher, sich eine Wrapper-Funktion zu schreiben, die zumindest das Umleiten der Ausgabe in eine String-Variable erlaubt -- damit man var_dump() auch benutzen kann:

  
function vdump(  
  $var,  
  $write_to_string = FALSE  
) {  
  ob_start();  
  var_dump($var);  
  $out = ob_get_contents();  
  ob_end_clean();  
  
  // für formatierte HTML-Ausgabe:  
  //$out = '<pre>'.preg_replace( array('/&/', '/\</', '/\>/'),array('&#38;', '&#60;', '&#62;'), $out ).'</pre>';  
  
  if(FALSE !== $write_to_string) return($out);  
  
  print($out);  
  return(TRUE);  
}  

Außerdem kann var_dump() nicht wirklich mit zirkulären Referenzen umgehen. Es "erkennt" sie erst im "zweiten Durchgang" und zeigt sie auch nicht an. Das kann, so wie es aussieht, nur print_r() richtig, wie man an der Ausgabe, die folgender Quelltext erzeugt, deutlich sieht:

  
<?php  
var_dump($GLOBALS);  
  
print_r($GLOBALS);  
?>  

MffG
EisFuX

--
... Suchmaschinen-Blog ...