PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Hook- und Callback-Funktionen (Teil 1)

Um eine Applikation schnell und einfach dynamisch um Funktionen zu erweitern kommen oft Hook- oder Callback-Funktionen zum Einsatz. Typo3 macht davon Gebrauch, die WordPress Entwickler lieben sie und auch bei Cake oder RubyOnRails kommen sie zum Einsatz.

Genau genommen sind Hook-Funktionen und Callback-Funktionen ein und das selbe. Sie werden aufgerufen, wenn eine bestimmte Aktion durchgeführt wird, wurde oder werden soll. Die zwei beliebtesten Typen von Hook-Funktionen sind folgende:

  • Vererbte oder Abstrakte Funktionen: Eine gängige OOP Technik, bei der eine Funktion abstrakt oder mit einem Default-Verhalten definiert wird, das von einer Kind-Klasse übernommen oder überschrieben wird.
  • Callback-Stack: Bei dieser Art registrieren sich Objekte bei einem Objekt, das den Callback-Funktionen-Stack verwaltet. Wird ein Ereignis ausgelöst, werden die zu dem Ereignis registrierten Objektfunktionen der Reihe nach aufgerufen.

Der Callback-Stack funktioniert so ähnlich wie das Observer-Muster. Zunächst nehmen wir aber die vererbbaren Hooks unter die Lupe. Hier erstmal eine einfache Basisklasse:

class File
{
    var $data; 

    function ReadFile($fn)
    {
        $tmp= file_get_contents($fn);
        $this->data= $tmp;
    } 

    function WriteFile($fn)
    {
        $tmp= $this->data;
        $fh= fopen($fn, 'w');
        $fwrite($fh, $tmp);
        $fclose($fh);
    }
}

Soweit, so gut. Bewusst werden die Daten erst mal in eine Temp-Variable gelesen. Denn die Hook-Funktionen fehlen ja noch. Wir fügen also folgende Funktionen der Basisklasse hinzu:

function &AfterOpen(&$data)
{
    return $data;
} 

function &BeforeSave(&$data)
{
    return $data;
}

Jetzt jetzt verändern wir in den beiden Hauptfunktionen die folgenden Funktionsaufrufe:

...
function ReadFile($fn)
{
    ...
    $this->data= $this->AfterOpen(&$tmp);
} 

function WriteFile($fn)
{
    $tmp= $this->BeforeSave(&$this->data);
    ...
}
...

Jetzt ist es wunderbar möglich, die Speicheroutine an eigene Dateistrukturen anzupassen. Einfach ein Kind der Klasse erschaffen und die Defaultfunktionen mit einer eigenen Implementierung überschreiben. Zum Beispiel so:

class PhpStructureFile extends File
{
    function &AfterOpen(&$data)
    {
        return unserialize($data);
    } 

    function &BeforeSave(&$data)
    {
        return serialize($data);
    }
}

Und schon ist es möglich, schnell und einfach eigene Dateitypen zu implementieren. Mit den Hook-Funktionen kann man noch viel mehr Unsinn treiben, welchen erfährst Du bald im nächsten Teil…

Teile und genieße
  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

PHP Blogger: Hook- und Callback-Funktionen (Teil 3) - Ein PHP Blog auf deutsch meint dazu:

17. Oktober 2008 um 13:33

[...] nie zum Ende gekommen ist: Es geht im Hook- und Callback Implementierungen. Teil 1 hat die eine Vererbungstechnik vorgestellt, in Teil 2 haben wir uns einen Callback-Stack angeschaut und weil mich ständig [...]

PHP Blogger: Hook- und Callback-Funktionen (Teil 2) - Ein PHP Blog auf deutsch meint dazu:

17. Oktober 2008 um 13:35

[...] 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 [...]

nbtwoy meint dazu:

23. Oktober 2008 um 04:58

lfiidekjuynmpkqwakdgirzgqqvpdh

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung