* @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 .= '' . $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 .='';
$this->output($html);
}
/**
* einfache Textausgabe
*/
function say($text) {
$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 .= '
Eigenschaften: ';
$html .= implode(', ', $props);
$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 .= ''; $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'); } } ?>