PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Callbacks und Hooks in PHP

with 10 comments

Dies ist ein Text, der von einem Autor auf content.de erstellt wurde. Mehr dazu im Artikel über den content.de Test.

Callbacks und Hooks sind beliebte Methoden in PHP, verschiedene Funktionen untereinander kommunizieren zu lassen. Sie dienen insbesondere der Funktionserweiterung. So nutzen beispielsweise Systeme wie WordPress und Drupal Callbacks und Hooks, um Plugins und Module sauber zu implementieren.

Die Bedeutung des Callback

Mit dem Callback werden ein oder mehrerer Parameter an eine Funktion übergeben. Diese Parameter werden über den Callback, zu deutsch „Rückruf“, direkt übergeben oder von einer anderen Stelle des Skripts abgerufen.

Beim Callback wird grob zwischen einfachen Funktionsnamen, Klassenmethoden und statischen Klassenmethoden unterschieden. In allen drei Fällen leitest du die Rückrufaktion mit call_user_func ein. Die aufgerufene Funktion startet aufgrund dieses Befehls den Abruf der übergebenen Parameter, welche in Form von Arrays oder Argumenten definiert sind, und gibt die entsprechenden Werte aus.

Einfacher Funktionsname und Klassenmethode

Es handelt sich beim Callback also um eine eigenständige Funktion, mit der du einer anderen Funktion einen Befehl erteilst. Mit diesem Befehl sind der Funktionsname und die Parameter als Argumente oder Arrays anzugeben, die abgerufen werden sollen. Hier ein kleines Beispiel für einen Callback mit einem einfachen Funktionsnamen:

// Callback mit einfachem Funktionsnamen
function mein_erster_callback() {
    echo 'Deine erste Callback-Funktion';
}
call_user_func('mein_erster_callback');

In obigem Beispiel ist „mein_erster_callback“ der Funktionsname. Das übergebene Argument lautet „Deine erste Callback-Funktion“ und wird mit call_user_func als solches ausgegeben. Ähnlich verhält es sich mit der Klassenmethode:

// Ein Callback nach der Klassenmethode
class Beispielklasse {
    function MeinZweiterCallback () {
        echo 'Deine zweite Callback-Funktion':
    }
}

Statt der Funktion wird hier die Klasse aufgerufen, die Ausgabe ist „Deine zweite Callback-Funktion“.

Callback-Funktionen mit array_map

Natürlich kannst du mit einem Callback auch kompliziertere Aktionen ausführen. Ein Beispiel dazu ist array_map, was die Callback-Funtion auf verschiedene Elemente anwendet. Mit array werden die Elemente definiert, die von array_map() abgerufen und verarbeitet werden sollen. Es ist auch möglich, verschiedene Elementegruppen über arrays zu definieren. Eine einfache Callback-Funktion mit array_map, in welchem die einzelnen Elemente mit sich selbst multipliziert werden:

function multiplizieren($n) {
    return($n * $n);
}
$a = array(1, 3, 5, 6, 12);
$b = array_map('multiplizieren', $a);
print_r($b);

Die Ausgabe lautet 1, 9, 25, 36, 144. Analog können beispielsweise in Communities beliebige Benutzerdetails oder andere Datenbank-Elemente mit einem Callback abgerufen und gelistet oder weiterverarbeitet werden.

Bedeutung des Hook

Ein Hook macht in etwa dasselbe wie der Callback. Du kannst ihn anwenden, um Programmcode in eine Anwendung zu integrieren. Er fungiert quasi als Schnittstelle. Der Sinn dahinter ist die Erweiterung einer Anwendung zu bestimmten Ereignissen oder Zeitpunkten. Über einen Hook kannst du also fremden Code abrufen und in der eigenen Anwendung damit arbeiten.

Es gibt Software, die genau darauf ausgerichtet ist und mit sogenannten Events arbeitet. Dies ist zum Beispiel bei Shopsystemen hilfreich. Es werden extern verschiedene Events definiert, die nach einer Registrierung an die eigene Funktion übermittelt werden. Dieser Übermittlung dient intern der Hook.

Written by Michael Kliewe

Mai 12th, 2011 at 9:55 am

Posted in PHP

Tagged with , , ,

10 Responses to 'Callbacks und Hooks in PHP'

Subscribe to comments with RSS or TrackBack to 'Callbacks und Hooks in PHP'.

  1. […] Die beiden Artikel befinden sich natürlich hier im Blog: Namespaces und Callbacks […]

  2. Hi,

    ich weiß zwar nicht wie alt der Artikel ist, wenn das stimmt dann ja von heute?

    Soweit ich weiß braucht man das da oben nicht mehr seit 5.3. Kurzes snippet findet man hier da es lambdas gibt seit der Ver. 5.3
    http://pastebin.com/e3MDjeaw

    Das 1. newMan() wäre ein Delegat der später aufgerufen wird über eine anderen funktion, nämlich blaaaaa wie unten zu sehen und dann in der Mitte noch eine anonyme funktion (lambda). Sollte soweit das gleiche sein oder täusche ich da?

    Gruß
    Chris

    Chris

    12 Mai 11 at 12:59

  3. Ebenso fehlt `create_function()` und die magische Methode `__invoke()`. Auch wenn ersteres eher untergeordnete Rolle spielt, hätte man es erwähnen sollen.

    KingCrunch

    12 Mai 11 at 13:37

  4. Ja aber ich finde man braucht das mit den Strings nicht mehr wenn die Unterstützung da ist, vorteil ist auch Intellisense, die man bei Strings leider nicht hat 🙂

    Chris

    12 Mai 11 at 13:45

  5. Oh weh, schon die Mischung der Passivformen und „Du kannst“ ist ein echtes Qualitätsmanko und deutet ziemlich sicher Richtung Google Translate. Naja und fachlich gehts wohl auch voll am Thema vorbei.

    nikosch

    13 Mai 11 at 00:54

  6. Etwas komisch geschrieben, wirkt irgendwie sehr dahingewurschtelt.
    Manualbeispiele mit Basiserklärungen.
    Ausserdem fehlt beim zweiten Beispiel der eigentliche Aufruf.

    Clemens

    13 Mai 11 at 14:28

  7. Ich sehe das genauso wie Clemens. Der Text ist sehr oberflächlich und unreif.

    Thorsten Richter

    14 Mai 11 at 13:20

  8. Hab selbst nochmal bissel rumgespielt und mein pastebin von oben verändert, da es falsch war, mein Fehler.

    http://pastebin.com/gqDR7JAB

    bla(func(„dase“)); funzt leider nicht, da func sofort aufgerufen wird und dann erst der Krempel in der Funktion bla() was ja nicht korrekt ist, kann man im neuen Beispiel gut sehen dass func() wirklich erst nach dem aufgerufen wird, wo man sie aufrufen wollte.

    Hat man delegates müssen sie leider mit strings aufgerufen werden, können aber innerhalb der funktion mit () ausgeführt werden (Oder gibts ab 5.3 doch auch noch eine andere Möglichkeit das zu ändern um doch Intellisense-Unterstützung zu haben???). Gibts diese Funktion nicht, gibts halt nen PHP typischen Fehler, kann man ja abfangen.

    Ansonsten Lambdafunktionen, funktionieren einwandfrei.

    Während Zeile 24 und 26 relativ identisch sind (das eine hat eben ne Var die eben die lambdafunktion aufnimmt und die andere bekommt sie gleich selbst übergeben), ist Zeile 25 so relativ das, was die array_map funktion intern tun müsste, wenn sie nicht selbst etwas anders arbeitet.

    Gibt sicherlich noch schönere Lösungen aber wiegesagt bei Strings hat man leider keine Intellisense-Unterstützung.

    Gruß
    Chris

    Chris

    31 Mai 11 at 10:08

  9. > Ansonsten Lambdafunktionen, funktionieren einwandfrei.

    Ja, du könntest den Aufruf der Delegate-Funktion in eine davon verpacken.

    Das Wikipedia-Beispiel unter „Delegat (.NET)“ in etwa auf PHP übertragen:

    http://pastebin.com/0HXzVaVw

    *schulterzuck* Glaube, in Sachen Code-Hints ist da dennoch nicht so ganz viel zu holen.

    mermshaus

    31 Mai 11 at 11:26

  10. Stimmt ^^ das mit dem Delegate in eine Lambda funktion, gute Idee ^^. Danke für den Tipp 😀

    Chris

    31 Mai 11 at 11:53

Leave a Reply

You can add images to your comment by clicking here.