Hallo Forum,
ich bin leider noch ein Neuling in OOP-Programmierung und versuche Momentan eine "Error Handler"-Klasse zu schreiben. Nun hab ich das Problem, dass man bei der Anmeldung der Funktionsnamen nur statische Methoden verwenden kann.
<?php
//Anmeldung der Methdonnamen
set_error_handler('errorHandler');
?>
Da ich meiner Klasse aber die Pfadangabe variabel angeben kann, hab ich jetzt das Problem, dass ich diese nicht der statischen Methode übergeben kann, zumindest wüsste ich jetzt nicht wie. Ich zeig mal einen kleinen Auszug aus der Klasse mit den relevanten Methoden.
<?php
class C_errorHandler {
/*** VARS ***/
private $errorFilePath = '';
/*** METHDOS ***/
public function errorHandler($errno, $errstr, $errorFile, $errline) {
//Hier benötige ich jetzt die $errorFilePath variable
//ich kann sie leider nicht auf statisch setzten, da ich sie ja noch im
//nachhinein ja noch initialisieren will
}
}//END_CLASS
?>
Gibt es hier eine Möglichkeit die Variable an die statische Methode zu übergeben oder bin ich generell auf dem falschen Dampfer. Über einen Lösungsvorschlag oder einen Ansatz wie man die Klasse richtig schreiben könnte, wäre ich euch sehr verbunden. Hier nochmal die gesamte Klasse, unter der Klasse befindet sich noch normaler ausführbarer Code um die Klasse zu testen.
class C_errorHandler {
/*** VARS ***/
private $errorFilePath = '';
private $errorLogFileName = '';
/* Nicht für die ini sondern für eine echo Ausgabe */
private $displayError = '';
/*** MAGIC-METHODS ***/
public function __construct(){
$this->setDefaultConfig();
$this->initErrorLogFile();
$this->initErrorReporting();
}//END_FUNC
private function __clone(){}
/*** METHODS ***/
private function setDefaultConfig() {
$this->errorFilePath = dirname(__FILE__).'\\';
$this->errorLogFileName = 'errorLog.log';
$this->displayError = false;
}//END_FUNC
private function initErrorLogFile() {
if (!file_exists($this->errorFilePath.$this->errorLogFileName)) {
$handle = fopen($this->errorFilePath.$this->errorLogFileName, "a+");
fclose($handle);
}//END_IF
}//END_FUNC
private function initErrorReporting() {
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', false);
}//END_FUNC
public function configErrorHandler($errorFilePath, $errorFileName,$displayErrorsOnScreen ) {
$errorFilePath .= '\\';
if( !ctype_alpha($errorFileName) )
return false;
$errorFileName .= '.log';
if( !file_exists($errorFilePath) )
return false;
if( !is_bool($displayErrorsOnScreen) )
return false;
$this->errorFilePath = $errorFilePath;
$this->errorLogFileName = $errorFileName;
$this->displayError = $displayErrorsOnScreen;
}//END_FUNC
/*
* Ich weiß das $this bei statischen Methoden nicht funktionieren,
* hab es vorher ohne statiche Methoden probiert.
*/
public static function errorHandler($errno, $errstr, $errorFile, $errline) {
$message = '';
switch ($errno) {
case E_ERROR:
/* no Fatal here */
case E_NOTICE:
$message = '---NOTICE------------------------------------'."<br/>\n";
$message .= 'Date: '.date("d.m.Y h:i:s")."<br/>\n";
$message .= 'File: '.$errorFile. ' - Line: '.$errline."<br/>\n";
$message .= $errstr."<br/>\n";
$message .= '--------------------------------------------'."<br/>\n";
error_log ($message, 3, $this->errorFilePath.$this->errorLogFileName);
break;
case E_WARNING:
$message = '---WARNING------------------------------------'."<br/>\n";
$message .= 'Date: '.date("d.m.Y h:i:s")."<br/>\n";
$message .= 'File: '.$errorFile. ' - Line: '.$errline."<br/>\n";
$message .= $errstr."<br/>\n";
$message .= '---------------------------------------------'."<br/>\n";
error_log ($message, 3, $this->errorFilePath.$this->errorLogFileName);
break;
default:
$message = '---Unkown error type-------------------------'."<br/>\n";
$message .= 'Date: '.date("d.m.Y h:i:s")."<br/>\n";
$message .= 'File: '.$errorFile. ' - Line: '.$errline."<br/>\n";
$message .= $errstr."<br/>\n";
$message .= '--------------------------------------------'."<br/>\n";
error_log ($message, 3, $this->errorFilePath.$this->errorLogFileName);
break;
}
if( $this->displayError )
echo $message;
}//END_FUNC
public static function handleShutdown() {
$error = error_get_last();
if($error !== NULL) {
$message = '---FATAL [SHUTDOWN]--------------------------'."<br/>\n";
$message .= 'Date: '.date("d.m.Y h:i:s")."<br/>\n";
$message .= 'File: '.$error['file']. ' - Line: '.$error['line']."<br/>\n";
$message .= $error['message']."<br/>\n";
$message .= '--------------------------------------------'."<br/>\n";
echo $message;
error_log ($message, 3, $this->errorFilePath.$this->errorLogFileName);
} else {
$message = '---FATAL [SHUTDOWN]--------------------------'."<br/>\n";
$message .= 'get no Error';
$message .= '--------------------------------------------'."<br/>\n";
}
}//END_FUNC
}//END_CLASS
$a = new C_errorHandler();
$a->configErrorHandler(dirname(__FILE__), 'error', true);
set_error_handler('C_errorHandler::errorHandler');
register_shutdown_function('C_errorHandler::handleShutdown');
echo $dsf;