Was ist eine Callback-Funktion
Hans Walter
- programmiertechnik
0 fastix®0 EndEffekt1 Tom2 Christian Seiler0 Tom
Liebe Forumsteilnehmer,
ich wünsche euch erst einmal ein Frohes Weihnachtsfest.
Sollte hier ein Programmierer trotz Weihnachtsstimmung mal gucken, hätte ich nur eine ganz einfache Frage:
Es gibt in einigen Programmiersprachen (z.B. PHP) sogenannte "callback functions".
siehe: http://de.php.net/manual/de/language.pseudo-types.php#language.types.callback, http://de.wikipedia.org/wiki/R%C3%BCckruffunktion
Handelt es sich dabei um dasselbe, was man früher als einen "indirekten Aufruf" bezeichnet hat, oder versteckt sich dahinter doch noch etwas mehr?
Euch allen noch ein paar besinnliche Stunden
wünscht Hans
Moin!
Eine Callback-Funktion wurde doch auf der von Die verlinkten PHP-Seite gezeigt:
<?php
// einfaches callback Beispiel
function meine_callback_funktion() {
echo 'hallo welt!';
}
call_user_func('meine_callback_funktion');
?>
Die Callback-Funktion ist "call_user_func", welche mit einem Funktionsname (hier: "meine_callback_funktion") und als String ggf. Argumenten (falls mehrere, dann als Array) aufgerufen wird.
<?php
// einfaches callback Beispiel
function meine_callback_funktion($str) {
echo $str;
}
call_user_func('meine_callback_funktion','hallo welt');
?>
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Oder ums in Worte zu fassen:
Eine Callback-Funktion ist eine Funktion, die einer anderen Funktion als Paramater übergeben wird. Diese wird dann mit entsprechenden Paramtern aufgerufen.
Zum Beispiel preg_replace_callback, sucht nach einem Suchmuster, und ruft, dann die als Paramter angegebene Funktion auf. Diesem Funktionsaufruf werden als Paramter die Treffer übergeben.
Die Callback-Funktion kann dann damit weiterarbeiten und liefert letztendlich einen Wert zurück, der durch die Suche ersetzt wird...
mfG
EndEffekt
Hello,
Oder ums in Worte zu fassen:
Eine Callback-Funktion ist eine Funktion, die einer anderen Funktion als Paramater übergeben wird. Diese wird dann mit entsprechenden Paramtern aufgerufen.
Zum Beispiel preg_replace_callback, sucht nach einem Suchmuster, und ruft, dann die als Paramter angegebene Funktion auf. Diesem Funktionsaufruf werden als Paramter die Treffer übergeben.
Die Callback-Funktion kann dann damit weiterarbeiten und liefert letztendlich einen Wert zurück, der durch die Suche ersetzt wird...
Dann wäre die Callback-Funktion tatsächlich nur ein indirekter Aufruf. Indirekt deshalb, weil zur Laufzeit des Scriptes noch festgelegt werden kann, welche Funktion sich hinter dem Namen, der als Paramter übergeben wird, tatsächlich verbergen soll. Bei Interpretersprachen verschwimmen diese Genzen ohnehin. Man kann sie von außen nicht mehr sehen.
Unter einer Callback-Funktion versteht man aber gewöhnlich einen abgekoppelten Prozess, eine Funktion, die mit einer Aufgabe betraut, in einem eigenen Thread weiterläuft, ohne dadurch die aufrufende Stammfunktion zu behindern oder gar anzuhalten. Die Stammfunktion behält also die Programmkontrolle und spaltet einen Prozess ab, der die zugewiesene Aufgabe erledigen soll. Wenn dieser terminiert (also kurz vorher natürlich), ruft er seinerseits wieder seinen Auftraggeber auf und hält diesen an, um ihm das Ergebnis zu übergeben. Daher der Name "Call Back".
Die Abarbeitung ist somit asynchron. Ein einfacher indirekter Aufruf wäre aber synchron, weil das Stammprogramm die Kontrolle an die aufgerufene Funktion überträgt. Das ist unabhängig davon, wann die Funktion impelementiert oder instanziiert wird.
Ob dies in PHP tatsächlich bei "Callback-Funktionen" so ist, habe ich noch nicht nachgesehen. Ich vermute aber, dass hier nur der Wunsch der Vater der Namensgebung war, aber die Erfüllung dieses Wunsches noch in der Zukunft liegt.
Andere Sprachen können aber solches "Multithreading". Ich meine, Java gehört dazu.
Harzliche Grüße vom Berg und Frohe Weihnachtszeit
Tom
Hallo,
Unter einer Callback-Funktion versteht man aber gewöhnlich einen abgekoppelten Prozess, eine Funktion, die mit einer Aufgabe betraut, in einem eigenen Thread weiterläuft, ohne dadurch die aufrufende Stammfunktion zu behindern oder gar anzuhalten. Die Stammfunktion behält also die Programmkontrolle und spaltet einen Prozess ab, der die zugewiesene Aufgabe erledigen soll. Wenn dieser terminiert (also kurz vorher natürlich), ruft er seinerseits wieder seinen Auftraggeber auf und hält diesen an, um ihm das Ergebnis zu übergeben. Daher der Name "Call Back".
Nein! Nein! Nein! Das, was Du beschreibst, trägt definitiv NICHT den Namen Callback! Ich weiß wirklich nicht, wo Du das her hast, aber unter Callback versteht man immer nur das:
Man übergibt einen "Zeiger" (wie auch immer geartet) auf eine Funktion an eine andere Funktion. Diese nutzt diesen Zeiger, um die Funktion dahinter aufzurufen, wenn bestimmte Ereignisse auftreten.
Beispiel: Ein XML-Parser ruft eine Callback-Funktion auf, sobald bestimmte Parser-Ereignisse auftreten ("Element gefunden", "Attribut gefunden" oder sowas in der Art...)
In PHP sehen die "Zeiger" halt so aus, dass man lediglich den Namen der Funktion als String übergibt (bzw. für Objekte wird's ein Array mit 2 Elementen: Objekt und Methodenname), währen in anderen Sprachen wie C tatsächlich die Adresse im Speicher der Funktion selbst übergeben werden.
Andere Sprachen können aber solches "Multithreading". Ich meine, Java gehört dazu.
Multithreading != Callbacks! Ich weiß wirklich nicht, woher Du das hast...
Christian
Hello,
Multithreading != Callbacks! Ich weiß wirklich nicht, woher Du das hast...
Na, sei doch ehrlich. Du bist Dir so sicher, dass Du es in Wirklichkeit gar nicht wissen willst :-)
Außerdem habe ich auch nicht behauptet, dass Callback == Multithreading ist. Lies doch nochmal genau.
Aber wie wäre es mit "Internet"? http://www.it-visions.de/glossar/alle/4860/Callback.aspx
oder mit "Vorlesung Echtzeit-Programmierung"?
Ich muss zugeben, dass Du mich mit dieser Absolutheit, in der Du hier antwortest, auch selber unsicher gemacht hast. Ist auch laaange her. Ich bin nun extra auf den Dachboden gestiegen, um die alten Unterlagen herauszuholen.
Der Name "callback function" kommt aus der frühen "Echtzeit-Programmierung". Er bezeichnet eine (damals "speicherresidente") Funktion, die beim EZOS zusammen z.B. mit der Anforderung an ein Device oder dem Aufruf eines Subsystems angemeldet wird, um das aufrufende Programm im Antwortfall (wenn also ein Ergebnis oder eine Meldung, also ein _Ereignis_ vorliegt) "zurückzurufen". Das aufrufende Programm läuft nach Erhalt der Quittung für die Registrierung sofort weiter.
Dies geschieht insbesondere bei Warteaufrufen mit explizitem Warten, aber auch bei sonstigen "nicht blockierenden Aufrufen".
Bei einem Warteaufruf mit implizitem Warten (synchroner Zugriff) wartet das aufrufende Programm direkt auf die Rückkehr und die Ergebnisse des aufgerufenen Prozesses. Dieser benötigt dann also keine Callback Funktion.
In dem von Dir genannten Kontext wird die Bezeichnung "Callback Funktion" eigentlich ausschließlich anstelle "Methode mit später Bindung" verwendet. Da hat er mMn fast keine Berechtigung. Die genannten PHP-Funktionen führen mWn alle nur implizite Warteaufrufe durch, wenn überhaupt.
Eine Berechtigung für "Callback" würde ich noch bei JavaScript sehen. Der Browser werkelt da munter vor sich hin und beim Eintritt eines bestimmten Ereignisses wird eine vorher registrerte Funktion aufgerufen. Diese unterbricht in dem Moment das "Hauptprogramm" (Beispiel: Popup mit focus(self)).
Da der Browser verschiedene Teilprozesse "gleichzeitig" durchführen kann, ist z.B. AJAX möglich.
Ich sehe hier keinen Grund, warum man die Herkunft von "Callback Funktion" nicht erwähnen sollte, auch wenn heute meistens nur noch der Wechsel zwischen unterschiedlichen Programmlayern damit gemeint ist.
Die Applikation meldet bei ihrem OS (oder zumindest einem niedrigeren Level) eine eigene Funktion an, die dann vom OS aufgerufen wird. Die Applikation wird also "zurückgerufen". In sofern stimmt es dann noch, ist aber nur die halbe Wahrheit.
Wenn es sich nur um synchrone (blockierende) Aufrufe handelt, ist die Bezeichnung "Callback Function" mMn aber fehl am Platze.
Harzliche Grüße
aus dem verschneiten Sankt Andreasberg
und Frohe Weihnachtszeit
Tom
Hi,
Du würfelst hier wieder einmal wild Halbwissen durcheinander, bei dem ich ehrlich gesagt keine Lust habe, das aufzudröseln. Ich hoffe für's Archiv, jemand anders erbarmt sich diesem gedanklichen Knoten...
Viele Grüße,
Christian
Einigen wir uns auf meine oberfläschliche Beschreibung mit der Begründung:
so geht!