Callbacks und Hooks in PHP
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.
[…] Die beiden Artikel befinden sich natürlich hier im Blog: Namespaces und Callbacks […]
Test von content.de, einem Inhalts-Portal | PHP Gangsta - Der PHP Blog
12 Mai 11 at 10:17
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
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
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
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
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
Ich sehe das genauso wie Clemens. Der Text ist sehr oberflächlich und unreif.
Thorsten Richter
14 Mai 11 at 13:20
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
> 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
Stimmt ^^ das mit dem Delegate in eine Lambda funktion, gute Idee ^^. Danke für den Tipp 😀
Chris
31 Mai 11 at 11:53
Hallo,
ich möchte von /cookieconsent.insites.com die OptIn Funktion zur Cookiebestätigung verwenden. Nun soll da in die Seite eine callback hook Funktion eingefügt werden. Diese steht hier:
https://cookieconsent.insites.com/documentation/disabling-cookies/
Wenn ich diese Funktion in die Webseite einfüge, öffnet sich diese aber leider nicht mehr.
Den Quellcode habe ich von hier:
https://cookieconsent.insites.com/download/
Unter Nr. 5 Punkt 3 opt into cookies
Habt ihr einen Tip für mich? Danke und viele Grüße
Lothar
9 Aug 18 at 13:43