dedlfix: Debuggen mit error_reporting(E_ALL)

Beitrag lesen

echo $begrüßung;

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

Den Unterschied verstehe ich nicht. Wie prüfst du den Variableninhalt, ohne ihn anzuzeigen?

[gettype() vs. var_dump()]

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

Ansichtssache. Die zusätzliche Information kann man ja ignorieren. Schwamm drüber.

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.

Stimmt. Für hartnäckige Fälle, die man in der Testumgebung nicht nachvollziehen kann, also Fehlersuche auf dem Produktivsystem, auf dem die Anwender nichts mitbekommen sollen, ist eine Ausgabe ins Logfile angebrachter. Da hätte ich einen Tipp: trigger_error() plus selbst geschriebener Error-Handler. Damit kann man wunderschön sämtliche Variablen im aktuellen Scope und Backtrace-Ausgaben einbeziehen.

(Error Handling and Logging Functions)

Bliebe noch die Ausgabe im Browser: Dort produziert es in der HTML-Darstellung Buchstabensalat. print_r() kann seine Ausgabe wenigstens in einen String umleiten.

Den Buchstabensalat kann man doch mit Hilfe eines <pre> in eine lesbare Form bringen. :-) (Quelltext-Anzeige wäre auch noch eine Option.)

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:

Meine sieht so aus (auch für PHP < 4.3.0 einsetzbar):

/**  
 * debug output of $what  
 * @param mixed $what  
 * @param boolean $vardump use var_dump instaed of print_r  
 * @param boolean $noPre don't use <pre> surrounding output  
 * @param boolean $htmlchars convert special html chars to entities  
 * @return void  
 */  
function Debug($what, $vardump = false, $noPre = false, $htmlchars = false) {  
  echo fDebug($what, $vardump, $noPre, $htmlchars);  
} //Debug  
  
/**  
 * returns debug presentation of $what  
 * @param mixed $what  
 * @param boolean $vardump use var_dump instaed of print_r  
 * @param boolean $noPre don't use <pre> surrounding output  
 * @param boolean $htmlchars convert special html chars to entities  
 * @return string  
 */  
function fDebug($what, $vardump = false, $noPre = false, $htmlchars = false) {  
  ob_start();  
    if ($vardump) {  
      var_dump($what);  
    } else { //if vardump  
      print_r($what);  
    } //else-if vardump  
  $ob = ob_get_contents();  
  ob_end_clean();  
  $result = $htmlchars ? htmlspecialchars($ob) : $ob;  
  if (!$noPre)  
    $result = "<pre>\n$result</pre>\n";  
  
  return $result;  
} //fDebug

echo "$verabschiedung $name";