Fehlerbehandlung mit Singleton Pattern in PHP


Anonymous Single Malt Scotch
Attribution-NonCommercial-ShareAlike License by clappstar

Heute gibt’s mal wieder ein nettes Erzeugungsmuster: das Singleton oder Einzelstück. Mit diesem Pattern kann man verhindern, dass mehr als ein Objekt einer Klasse instanziiert wird. Nützlich ist das Pattern für die Kapselung von Datenbankverbindungen, oder wie in meinem Fall zur Fehlerbehandlung.

Das Prinzip ist schnell erklärt:

Da wir keine neuen Objekt der Klasse erzeugen wollen, ist der Konstruktor uninteressant. Alles was benötigt wird ist eine Referenz auf das einzige erzeugte Objekt. Dafür gibt es die statische Methode getInstance(). In der Methode wird geprüft, ob schon ein Objekt der Klasse vorhanden ist. Falls nicht, wird eine Instanz erzeugt und die Referenz im Klassenattribut $uniqueInstance gespeichert In jedem Fall wird das statische Attribut $uniqueInstance zurückgegeben. .
Der Beispielcode:

class ErrorManager {
	private  $errors, $errorCodes;
	private static $uniqueInstance=NULL;

	private final function __clone(){}
	private function __construct(){
		/** **/
	}

	public static function getInstance(){
		if (self::$uniqueInstance === NULL)
			self::$uniqueInstance = new ErrorManager();
		return self::$uniqueInstance;
	}//getInstance
}

Copy Operator und Konstruktor werden überschrieben, damit niemand durch Vererbung das Pattern aushebeln kann. Die Referenz auf das Objekt können wir uns mit dem Scope Operator besorgen:

$err_manager = ErrorManager::getInstance();

Wer es nicht glaubt kann die Instanz 2 verschiedenen Variablen zuweisen und vergleichen:

$e1 = ErrorManager::getInstance();
$e2 = ErrorManager::getInstance();
if ($e1 === $e2)
    echo "equal";

Soviel zum Singleton Pattern und weiter mit der Fehlerbehandlung. Fehlermeldungen sind immer ein zweischneidiges Schwert, wenn es um Webapplikationen geht. Dem Entwickler helfen sie und irgendwelchen Scriptkiddies leider auch. In der php.ini kann man sie zwar komplett abschalten, aber vielleicht möchte man die Meldungen bestimmten angemeldeten Nutzern nicht vorenthalten. Meine Interpretation des Errorhandlings ist durchaus ausbaufähig aber schon recht brauchbar. Wichtig für die Funktionalität ist das Hochschrauben des Error Reportings:

error_reporting( -1 );

Nun muss ein Errorhandler angegeben werden . Das mache ich im Konstruktor:

	private function __construct(){
			$this->errors = array();
			error_reporting( -1 );
			set_error_handler ( array(__CLASS__, 'errorHandle' ) );
	}

Statt Warnungen und Fehler in die Ausgabe zu schreiben, wird alles nun an die Methode errorHandle übergeben. Ich habe ein Array mit abstrakten Datentypen – AdtError genannt -angelegt. Die Methode erzeugt nun AdtError Objekte und pusht diese in ein Array:

	public static function errorHandle( $code, $msg, $file, $line ){
		$error = new AdtError($code, $msg, $file, $line);
		$s = self::getInstance();
		array_push($s->errors, $error);
	}//errorHandle

Für die Ausgabe hat AdtError die Java-like Methode toString():

	public function getErrors(){
		$s = self::getInstance();
		foreach ($s->errors as $error)
			echo $error->toString().'

';

	}//getErrors

Wenn man nun den Errorhandler anmeldet und ein wenig Unfug schreibt, wird alles wunderbar abgefangen und bei Bedarf ausgegeben:

$err_manager = ErrorManager::getInstance();

foreach ($e_codes as $code => $value)
	echo $code ." ". $value."

";

$err_manager->getErrors();

Bildschirmausgabe:

E_NOTICE Undefined variable: e_codes /home/schmiddi/web/gloria/err_handling/CErrorhandling.php 93
E_WARNING Invalid argument supplied for foreach() /home/schmiddi/web/gloria/err_handling/CErrorhandling.php 93

Wunderbar. Wie schon gesagt gibts durchaus Raum für Verbesserungen. So könnte man der Klasse Abbruchbedingungen beibringen, optional in Textdateien schreiben, schöner Formatieren das Ding in ein MVC Muster hauen usw. Für Interessierte gibts noch den Quelltext: ErrorManager

Advertisements
Dieser Beitrag wurde unter php abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s