Warum die anonyme Funktion verwenden? [duplicate]

Lesezeit: 8 Minuten

Benutzer-Avatar
Schuh

Mögliches Duplikat:

Wie verwendet man anonyme Funktionen in PHP?

Warum sollte ich eine anonyme Funktion verwenden? Ich meine, was ist das eigentliche Geschäft damit? Ich verstehe das einfach nicht. Ich meine, Sie verwenden Funktionen, um den Code sauberer zu machen oder um ihn mehr als einmal zu verwenden. Aber anonyme Funktionen machen weder das Erste noch das Zweite. Ich habe sie gegoogelt und konnte niemanden finden, der das gleiche Problem hat.

  • Können Sie Schließungen aus dem Titel entfernen? Es ist leicht tangential zum Fleisch Ihrer Frage.

    – Bradley Kreider

    10. November 2010 um 18:05 Uhr

  • @rox0r – Sie glauben wirklich, dass Schließungen nichts miteinander zu tun haben? schien mir angemessen, also habe ich meine Antwort auf eine Weise eingebaut, von der ich hoffe, dass sie zur Demonstration nützlich ist. offensichtlich können Sie Lambda-Funktionen ohne Closures haben, aber nicht umgekehrt

    – jon_darkstar

    10. November 2010 um 18:17 Uhr

  • @jon: Ich denke, sie sind verwandt, aber seine Absicht schien sich auf nur benannt vs. anonym zu konzentrieren. Funktionen. Ich finde es gut, dass Sie Schließungen erwähnt haben, ich dachte nur, dass es im Titel irreführend ist.

    – Bradley Kreider

    10. November 2010 um 18:24 Uhr

Benutzer-Avatar
Andrej

Ich würde sagen, dass anonyme Funktionen ihre Schönheit zeigen, wenn es gute Bibliotheksklassen/Funktionen gibt, die sie verwenden. Sie sind an sich nicht so sexy. In der Welt von .net gibt es eine Technologie namens LINQ, die auf sehr idiomatische Weise großen Gebrauch davon macht. Nun zurück zu PHP.

Erstes Beispiel, sortieren:

uasort($array, function($a, $b) { return($a > $b); });

Sie können eine komplexe Logik für die Sortierung angeben:

uasort($array, function($a, $b) { return($a->Age > $b->Age); });

Ein anderes Beispiel:

$data = array( 
        array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'), 
        array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'), 
        array('id' => 3, 'name' => 'James', 'position' => 'Director') 
); 

$names = array_map( 
        function($person) { return $person['name']; }, 
        $data 
);

Sie sehen, wie schön Sie eine Reihe von Namen erstellen können.

Letzter:

array_reduce(
   array_filter($array, function($val) { return $val % 2 == 0; },
   function($reduced, $value) { return $reduced*$value; }
)

Es berechnet das Produkt gerader Zahlen.

Etwas Philosophie. Was ist Funktion? Eine Funktionseinheit, die aufgerufen werden kann, und eine Code-Wiederverwendungseinheit. Manchmal benötigen Sie nur den ersten Teil: die Fähigkeit, Aktionen aufzurufen und auszuführen, aber Sie möchten ihn überhaupt nicht wiederverwenden und ihn sogar für andere Teile des Codes sichtbar machen. Das ist es, was anonyme Funktionen im Wesentlichen tun.

  • +1 für nicht-triviale Verwendung und zum Komponieren von Reduzieren und Filtern

    – jon_darkstar

    10. November 2010 um 18:12 Uhr

  • @jon_darkstar in C# ist es trivial 🙂 es ist eher funktionaler Stil.

    – Andrej

    10. November 2010 um 18:25 Uhr

  • Ich bin gerade auf meinen eigenen Reisen darüber gestolpert, es war fünf Jahre später sofort hilfreich. +1

    – James Spence

    24. März 2015 um 21:45 Uhr

Es ist besonders für Rückrufe nützlich:

array_walk($myArray, function($value, $key) {
   // do something
});

  • wie ist es dann besser foreach? Dies ist ein bedeutungsloses Beispiel. Es zeigt etwas, was mit einem anderen Konstrukt noch einfacher gemacht werden kann. es zeigt nicht die Nützlichkeit der anonymen Funktion. Ja wirklich.

    – Andrej

    10. November 2010 um 18:05 Uhr


  • Der OP hat nicht gefragt, was besser ist. Es wurde gefragt, wozu es nützlich ist. Die Antwort: Rückrufe. Wenn Sie 1000 Beispiele geben möchten, können Sie dies gerne in Ihrer eigenen Antwort tun.

    – Netcoder

    10. November 2010 um 18:10 Uhr

  • Recht. “Es wurde gefragt, wofür es nützlich ist.” In Ihrem Beispiel sind sie überhaupt nicht nützlich. Ich sage nicht, dass Sie 1000 Beispiele liefern sollten. Einer könnte genügen, aber ein repräsentativer und relevanter.

    – Andrej

    10. November 2010 um 18:19 Uhr


  • @Andrey: Wenn Sie der Meinung sind, dass meine Antwort nicht nützlich genug ist, stimmen Sie sie nicht positiv ab und geben Sie eine Ihrer Meinung nach bessere Antwort an. Ende der Geschichte.

    – Netcoder

    10. November 2010 um 18:24 Uhr

Benutzer-Avatar
NikiC

Anonyme Funktionen verwenden Sie in der Regel für Funktionen, die Sie nur einmal benötigen. Auf diese Weise verschmutzen Sie den Funktionsnamensraum nicht und erfinden keine seltsamen Funktionsnamen wie array_walk_callback1.

  • Hoffentlich erfinden Sie nie diese seltsamen Funktionsnamen. Dinge wie returnUsefulDataFromArray wäre nützlicher 🙂

    – gnarf

    10. November 2010 um 17:59 Uhr

Benutzer-Avatar
Mchl

Der vielleicht offensichtlichste Grund ist die Verwendung von Rückrufen. Nehmen usort() Funktion zum Beispiel. Es hat keinen Sinn, eine einzeilige Funktion einzuführen, die nur einmal verwendet wird. Die anonyme Funktion passt (normalerweise) besser zu dieser Aufgabe.

Sie können anonyme Funktionen herumreichen, indem Sie sie in einer Variablen speichern.

$a=function() {
    echo 'hello world';
};

Sie können sie also auch mehrfach verwenden.

  • Warum deklarieren Sie dann nicht einfach eine Funktion?

    – Schuh

    10. November 2010 um 18:07 Uhr

  • “mehr als einmal”. Können Sie die reguläre Funktion nicht mehr als einmal verwenden?

    – Andrej

    10. November 2010 um 18:07 Uhr

  • Sie sollten bedenken, dass deklarierte Funktionen global sind, anonyme Funktionen jedoch nicht. Sie wollen den globalen Namensraum nicht mit einmal verwendbaren und trivialen Funktionen verschmutzen

    – bcosca

    10. November 2010 um 18:08 Uhr


  • Außerdem können variable Funktionen mit zerstört werden unsetwährend globale Funktionen dies nicht können.

    – Netcoder

    10. November 2010 um 18:19 Uhr

  • @Abdul: Der Umfang ist in PHP und Java sehr unterschiedlich. Tatsächlich ist das Scoping in PHP auf den globalen Geltungsbereich und den Funktionsumfang beschränkt. z.B: { $foo = "bar"; } echo $foo; funktioniert in PHP. { String foo = "bar"; } System.out.println(foo); nicht in Java. Das Zurücksetzen von Variablen kann nützlich sein, um zu verhindern, dass der Bereich verschmutzt wird, was schließlich zu Programmierfehlern führen kann. Das gilt sowohl für Variablen als auch für Variablenfunktionen.

    – Netcoder

    10. Juli 2015 um 19:06 Uhr


Wenn Sie einen Rückruf erstellen müssen (um ein konkretes Beispiel zu nennen, sagen wir, es ist eine Vergleichsfunktion für usort), sind anonyme Funktionen normalerweise ein guter Weg. Besonders wenn die Definition der Funktion von wenigen Eingaben abhängig ist (damit meine ich eine Closure, die NICHT gleichbedeutend mit einer anon-Funktion ist)

function createCallback($key, $desc = false)
{
    return $desc ? 
       function($a, $b) use ($key) {return $b[$key] - $a[$key];} :
       function($a, $b) use ($key) {return $a[$key] - $b[$key];};
}


usort($myNestedArray, createCallback('age'));  //sort elements of $myNestedArray by key 'age' ascending
usort($myNestedArray, createCallback('age', true); //descending

  • Warum deklarieren Sie dann nicht einfach eine Funktion?

    – Schuh

    10. November 2010 um 18:07 Uhr

  • “mehr als einmal”. Können Sie die reguläre Funktion nicht mehr als einmal verwenden?

    – Andrej

    10. November 2010 um 18:07 Uhr

  • Sie sollten bedenken, dass deklarierte Funktionen global sind, anonyme Funktionen jedoch nicht. Sie wollen den globalen Namensraum nicht mit einmal verwendbaren und trivialen Funktionen verschmutzen

    – bcosca

    10. November 2010 um 18:08 Uhr


  • Außerdem können variable Funktionen mit zerstört werden unsetwährend globale Funktionen dies nicht können.

    – Netcoder

    10. November 2010 um 18:19 Uhr

  • @Abdul: Der Umfang ist in PHP und Java sehr unterschiedlich. Tatsächlich ist das Scoping in PHP auf den globalen Geltungsbereich und den Funktionsumfang beschränkt. z.B: { $foo = "bar"; } echo $foo; funktioniert in PHP. { String foo = "bar"; } System.out.println(foo); nicht in Java. Das Zurücksetzen von Variablen kann nützlich sein, um zu verhindern, dass der Bereich verschmutzt wird, was schließlich zu Programmierfehlern führen kann. Das gilt sowohl für Variablen als auch für Variablenfunktionen.

    – Netcoder

    10. Juli 2015 um 19:06 Uhr


Benutzer-Avatar
Schuh

Es gibt Zeiten, in denen Sie eine Funktion verwenden MÜSSEN. Somit halten Closures den Code sauber, indem Sie Ihre Bibliotheken nicht mit Funktionsdeklarationen füllen müssen, die nur an einer Stelle verwendet werden. Schließungen sind ähnlich wie style="" und Klassen in CSS. Sicher, Sie können eine Schiffsladung von Klassen für jeden einzelnen Stil erstellen, den Sie haben, oder Sie können sie an Ort und Stelle einbetten, da Sie sie nirgendwo anders verwenden und die Aufblähung Ihrer CSS-Dateien verringern.

Dies ist jedoch nicht unbedingt erforderlich. Wenn Sie also das Bedürfnis verspüren, Funktionen explizit zu deklarieren, können Sie dies tun.

  • Aber wenn ich diese Funktion nur einmal verwende, warum sollte ich dann nicht einfach überhaupt keine Funktionen deklarieren? Weder die normale noch die anonyme?

    – Schuh

    10. November 2010 um 17:57 Uhr

  • Und möchten Sie wirklich, dass Ihr HTML mit Tags verschmutzt wird, die die Präsentation und nicht den Inhalt beschreiben?

    – gnarf

    10. November 2010 um 18:00 Uhr

  • Anonyme Funktionen helfen, wenn Sie EINE FUNKTION VERWENDEN MÜSSEN – wie in usort, array_map usw. In diesen Fällen müssten Sie traditionell irgendwo im Code eine Funktion erstellen und den Namen der Funktion übergeben. Bei anonymen Funktionen können Sie einfach deklarieren es auf die Schnelle. Es hilft auch bei Rückrufen. Ihre Beispiele scheinen darauf hinzudeuten, dass Sie an anonyme Funktionen nur als Möglichkeiten zum Gruppieren von Code denken – was sie sein können, aber das ist nicht der eigentliche Zweck von ihnen.

    – methodin

    10. November 2010 um 18:00 Uhr

  • @charlie Manchmal muss eine Funktion als Parameter übergeben werden. Deshalb wird von Rückrufen gesprochen. Wenn Callbacks verwendet werden, müssen Sie dem Callback eine Funktion übergeben.

    – Bradley Kreider

    10. November 2010 um 18:03 Uhr

  • @rox0r Das habe ich verstanden, aber Sie könnten auch einen String mit dem Funktionsnamen als Callback verwenden. Wie auch immer, danke, ich weiß, ich weiß.

    – Schuh

    10. November 2010 um 18:09 Uhr

1296400cookie-checkWarum die anonyme Funktion verwenden? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy