* @version 0.1.4 * @copyright GPL */ /** * Klasse zur Fehlerbehandlung */ class errorHandler { var $object = ''; var $method = ''; var $is_silent = FALSE; var $messages; function errorHandler($object='Objekt', $method='Methode') { $this->object = $object; $this->method = $method; $this->messages = array(); } /** * Wrapperfunktion um Ausgabe zu steuern * * Die Ausgabe der Funktionsaufrufe wird abhängig von der Instanzvariablen * is_silent in eine Variable umgeleitet oder direkt ausgegeben. * * @param string $output */ function output($output) { if ( $this->is_silent ) { $this->messages[] = $output; } else { echo $output; } } /** * Zwischenspeicher ausgeben */ function flush_output_cache() { $msgs = $this->messages; foreach( $msgs as $key=>$msg ) { echo $msg; unset($this->messages[$key]); } } /** * HTML-Ausgabe unterbinden */ function silent() { $this->is_silent = TRUE; } /** * Ausgabe von Meldungen ermöglichen */ function verbose() { $this->is_silent = FALSE; } /** * Eine Variable ausgeben * * Der Inhalt der übergebenen Variable wird ausgegeben und * ein ggf. zusätzlich übergebener Infotext wird davorgeschrieben. * * Wenn die Variable ein Objekt ist, werden Informationen über die * zugrundeliegende Klasse zurückgegeben. * * @param mixed $var * @param string $text optional, Standardwert ist "Variableninhalte" */ function sv($var, $text='Variableninhalte') { if ( !isset($var) ) return; $html = '
'; if ( is_object($var) ) { $object = ( $text == 'Variableninhalte' )? 'Objekt': 'Objekt '.$text; $html .= ''.$this->object . ' - ' . $this->method . ' - '.$object.''."\n"; $html .= "\tDas ".$object." ist Instanz der Klasse ".get_class($var)."\n"; $html .= ''; $this->output($html); } /** * einfache Textausgabe */ function say($text) { $html = '' . $object . ' - Variablen'."\n"; #$html .= var_export( get_class_vars(get_class($var)), TRUE ); $html .= var_export( get_object_vars($var), TRUE ); $html .= "\n"; $html .= '' .$object. ' - Methoden'."\n"; $methods = get_class_methods($var); sort($methods); foreach( $methods as $method ) { $html .= " - ".$method."\n"; } $html .= ''."\n"; } else { $var = ( is_string($var) )? htmlspecialchars($var): $var; $html .= ''.$this->object . ' - ' . $this->method . ' - '.$text.''."\n"; $html .= var_export( $var, TRUE ); } $html .='
'.$text.''; $this->output($html); } /** * Variable analysieren und inklusive einiger Eigenschaften ausgeben */ function analyze($var, $text = 'Variableninhalte') { $this->sv($var, $text); if (is_bool($var)) $props[] = 'boolean'; if (is_null($var)) $props[] = 'null'; if (is_string($var)) $props[] = 'string'; if (is_numeric($var)) $props[] = 'numeric'; if (is_float($var)) $props[] = 'float'; if (is_object($var)) $props[] = 'object'; if (is_array($var)) $props[] = 'array'; $html .= '
'; $this->output($html); } /** * Eine Variable ausgeben und Skript beenden * * @param mixed $var * @param string $text optionaler Parameter. */ function svaq($var, $text = 'Variableninhalte') { $this->sv($var, $text); $this->stop(); } /** * SQL ausgeben */ function sql($var, $text = 'SQL') { $var = preg_replace('@ (BETWEEN|AND|OR) @', ' $1 '."\n", preg_replace('@(SELECT|INNER|WHERE|FROM|LIMIT|GROUP|HAVING) @',"\n".'$1 ', $var)); $this->sv($var, $text); } /** * Superglobale $_FILES ausgeben */ function files() { $this->sv($_FILES, 'Superglobale $_FILES - enthält Uploaddaten'); } /** * Superglobale $_POST ausgeben */ function post() { $this->sv($_POST, 'Superglobale $_POST - enthält Formulardaten'); } /** * Superglobale $GLOBALS ausgeben */ function globals() { $this->sv($GLOBALS, 'Superglobale $GLOBALS - enthält alle Variablen'); } /** * Superglobale $_SESSION ausgeben */ function session() { $this->sv($_SESSION, 'Superglobale $_SESSION - enthält Sessiondaten'); } /** * Superglobale $_COOKIE ausgeben */ function cookies() { $this->sv($_COOKIE, 'Superglobale $_COOKIE - enthält Cookiedaten'); } /** * Zeitmessungen * * Eine Beispielfunktion für die Zeiterfassung ist beigefügt, sie muss im Bedarfsfall an den Anfang der * index.php geschrieben werden. * * Die Einbindung des ErrorHandler und der Aufruf der Funktion timer sollte direkt nach der Ermittlung der * Endzeit (höhö) geschehen. Je nach Anwendungsfall kann dies in vollständig in der index.php geschehen. * * Man sollte sicherstellen, dass die Genauigkeit des float-Datentyps richtig eingestellt ist. Mit der Standard- * Einstellung "precision = 12" ist man nur bis 0.01 Sekunden genau. * In der php.ini sollte man also * precision = 16 * einstellen * * @param float $start Startzeit als Microtime * @param float $end Endzeit (höhö) als Microtime * @param int $interval Aktualisierungsintervall in Sekunden */ function timer($start, $end, $interval) { /* ini_set('precision', '16'); function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $start = getmicrotime(); # Code $end = getmicrotime(); */ if ( $interval > 0 ) { $interval = $interval * 1000; } elseif ($interval == 0) { unset($_SESSION['test']); return; } if ( !isset($_SESSION['test']['time']) ) $_SESSION['test']['time'] = 0; if ( !isset($_SESSION['test']['count']) ) $_SESSION['test']['count'] = 0; $time = $this->_format_number($end - $start); $_SESSION['test']['time'] += $time; $avg = $this->_format_number($_SESSION['test']['time'] / ++$_SESSION['test']['count']); $html .= 'Eigenschaften: '; $html .= implode(', ', $props); $html .= '
'; $html .= 'Zeit für aktuellen Durchlauf: '.$time.' Sekunden (Nr. '.$_SESSION['test']['count'].")\n"; $html .= 'Durchschnittliche Zeit: '.$avg." Sekunden"; $html .= ''; $html .= ' '; $this->output($html); } /** * Skript anhalten */ function stop() { exit(); } function _format_number($number) { return str_pad(substr(round($number, 5), 0, 7), 7, '0'); } } ?>