Im ersten Teil dieser kleinen Serie hab ich einen Blick auf vererbte oder abstrakte Klassen geworfen - jetzt ist erst einmal der Callback-Stack dran. Ich denke, das ganze Thema in zwei Teilen abzufackeln, ist ein Ding der Unmöglichkeit. Dafür gibt es einfach zu viele Varianten. In den ersten beiden Teilen stelle ich mal die Basisvarianten vor, in Teil 3 und 4 gehe ich auf mögliche Erweiterungen ein.
Ich hatte bereits erwähnt, das ein Callback-Stack dem Observer-Muster sehr ähnelt. Wie funktioniert das Observer-Muster nun genau? Wer das gepeilt hat, schnallt auch schnell das Callback-Stack-Prinzip:
Alles in allem ist das ganze sehr einfach (Auch hier könnte man Bücher über Bücher schreiben, ich beschränke mich mal auf die Basics): Der Observer ist ein Objekt, bei dem sich andere “anmelden”. Das kann pauschal sein, das heisst das Observerobjekt ist auf eine Aktion spezialisiert. Anders ist es, wenn ein Observerobjekt mehrere Aktionen verarbeiten kann, dann erfolgt die Anmeldung nicht pauschal, sondern ist auf eine Aktion spezialisiert. Schauen wir uns beide Fällt mal als Pseudocode an:
Eine pauschale Registrierung:
$actionObserver->register($object);
Eine auf eine Aktion spezialisierte Registrierung:
$observer->registerFor("action", $object);
Egal, ob es eine pauschale oder eine spezialisierte Observervariante ist, der weitere Ablauf ist der selbe: Wird durch einen Event die gewünschte Aktion ausgelöst, werden alle registrierten Objekte benachrichtigt. Meist wird den Objektfunktionen, die aufgerufen werden, noch Parameter mitgegeben, an Hand derer der Statuswechsel (bzw. der Aktionsauslöser) innerhalb der aufgerufenen Funktionen nachvollzogen und entsprechend weiterverarbeitet werden kann.
Eine abstrakte Funktion innerhalb des Observer-Objektes könnte so aussehen:
function _CallRegisteredObjects($action)
{
foreach($this->registeredObjects[$action] as $obj)
$obj->releaseAction($action, $this->attributes);
}
Alle registrierten Objekte werden benachrichtigt, falls eine Statusänderung auftritt. Interessant wird es im nächsten Teil, dann schauen wir uns mal eine konkrete Implementierung an, wie sie auch in ähnlicher Art und Weise von Wordpress und großen Frameworks eingesetzt wird.
See you.

















