2016-05-27 16 views
6

Ich habe mit PHP Web-Entwicklung gelernt und ich bin ein wenig verwirrt über die anonymen Funktionen. Speziell was das Übergeben von Parametern betrifft und wie sie in einer solchen Funktion funktionieren. Zum Beispiel im CodeVerständnis anonyme Funktionen PHP

$array = array("really long string here, boy", "this", "middling length", "larger"); 
usort($array, function($a, $b) { 
return strlen($a) - strlen($b); 
}); 
print_r($array); 

ich nicht wirklich bekommen, wie die Parameter $a und $b verwendet werden. Ich denke, dass sie zum Vergleich genommen werden, um das Array nach dem zu sortieren, wo es definiert ist, wie die Funktion sie verwenden und aus denen sie nehmen soll?
In einem Code wie die nächste

$mult = function($x) 
{ 
return $x * 5; 
}; 
echo $mult(2); 

Ich weiß, dass der Parameter direkt an die Funktion übergeben wird, und verwendet, um das Ergebnis der Multiplikation zurückzukehren.
In diesem post das Beispiel

$arr = range(0, 10); 
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; }); 
$arr_square = array_map(function($val) { return $val * $val; }, $arr); 

, wo die Variable $val aus genommen wird?

Ich weiß, vielleicht ist dies nicht so kompliziert, wie es scheint, aber ich bin wirklich verwirrt über die Verwendung der Parameter auf diese Art von Funktionen

+1

Im Allgemeinen wollen Sie die Dokumentation für die äußere Funktion zB [array_map] (http://php.net/manual/en/function.array-map.php) in php nachschlagen oder [array.reduce] (https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) in JavaScript, um zu wissen, welche Parameter an den von Ihnen bereitgestellten Callback übergeben werden. – James

Antwort

9
usort($array, function($a, $b) { 
    return strlen($a) - strlen($b); 
}); 

Lassen Sie uns dieses Beispiel. Wenn Sie eine Funktion usort() passieren, PHP intern nennt es mit zwei Elementen aus dem Array zu sehen, welche kleinen größer/ist.

Die $a und $b Werte stammen aus innen die usort() Funktion. Sein Code ruft die bereitgestellte Funktion mit 2 Parametern auf. Ihre Parameter müssen nicht $a und $b genannt werden, sie können benannt werden, was auch immer Sie mögen.

+2

Und wenn Sie mit einem bestimmten Satz von Parametern eine anonyme Funktion in einem Array aufrufen können Sie entweder tun '$ anonym ($ var1, $ var2)' oder '$ result = call_user_func ($ anonym, $ var1, $ var2) ' – h2ooooooo

+0

yeah, weisen Sie es einer Variablen zu oder rufen Sie es direkt an.Also, im Grunde werden die beiden Argumente intern durch die Funktion verwaltet, ich muss sie nur liefern und die abrufbare wird ihre Magie tun? –

+0

@Kronos: Die "Argumente" werden in der Funktion ja behandelt. Irgendwo in 'usort()' s Code ist eine Zeile wie: '$ pos = $ Callback ($ arr [0], $ arr [1]);'. Von hier kommen die Argumente, wenn Ihre Funktion aufgerufen wird. (Anmerkung: Ich habe diese Zeile als Beispiel gemacht, es ist nicht * wörtlich * in 'usort()' s Code.) –

1

Ihre Frage ist nicht wirklich über anonyme Funktionen, sondern über die Weitergabe calllables.

nehmen wir die erste von Ihnen Beispiele unter Berücksichtigung

usort($array, function($a, $b) { 
return strlen($a) - strlen($b); 
}); 

ist es ein wenig Lassen Sie Refactoring durch anonyme Funktion mit dem Namen Funktion zu ersetzen.

function compareAB($a, $b) { 
return strlen($a) - strlen($b); 
} 

usort($array, 'comapreAB'); 

Wie Sie sehen können Sie immer noch fragen, wie $a und $b weitergegeben werden.

Nun, die Antwort ist sehr einfach. usort erwartet, dass Sie aufrufbar bereitstellen, das 2 Argumente benötigt und es intern aufruft.

+0

aber das passiert nur in php eingebauten Funktionen? Wie funktioniert eine vom Benutzer definierte aufrufbare Funktion? –