2016-05-27 12 views
6

Uczę się programowania stron internetowych za pomocą php i jestem trochę zmieszany z anonimowymi funkcjami. Dotyczy to w szczególności przekazywania parametrów i ich działania w takich funkcjach. Na przykład, w kodzieZrozumienie funkcji anonimowych 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); 

naprawdę nie dostać, jak wykorzystywane są parametry $a i $b. Myślę, że są one brane do porównania w celu uporządkowania tablicy, gdzie jest zdefiniowane, w jaki sposób funkcja powinna z nich korzystać i odjąć je?
w kodzie jak następnego

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

wiem parametr jest przekazywany bezpośrednio do funkcji i używany do powrotu wynik mnożenia.
W tym post przykład

$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); 

gdzie jest zmienna $val pochodzi?

wiem, może to nie jest tak skomplikowane jak się wydaje, ale jestem naprawdę mylić o wykorzystaniu parametrów na tego rodzaju funkcji

+1

Ogólnie rzecz biorąc, chcesz wyszukać dokumenty dotyczące funkcji zewnętrznej, np. [Array_map] (http://php.net/manual/en/function.array-map.php) w ​​php lub [array.reduce] (https) : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) w javascript, aby dowiedzieć się, jakie parametry przekazuje się do wywołania zwrotnego, które chcesz przekazać. – James

Odpowiedz

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

Weźmy ten przykład. Po przejściu funkcji do usort(), wewnętrznie wywołuje ją z 2 elementami z tablicy, aby zobaczyć, który jest większy/mniejszy.

W $a i $b wartości pochodzą z wewnątrz funkcja usort(). Jego kod wywołuje podaną funkcję dwoma parametrami. Twoje parametry nie muszą być nazwane $a i $b, mogą być nazwane, co chcesz.

+2

A jeśli chcesz wywołać funkcję anonimową w tablicy z określonym zestawem parametrów, możesz wykonać '$ anonymous ($ var1, $ var2)' lub '$ result = call_user_func ($ anonymous, $ var1, $ var2) ' – h2ooooooo

+0

tak, przypisz go do zmiennej lub wywołaj ją bezpośrednio.Więc, w zasadzie, te dwa argumenty są zarządzane wewnętrznie za pomocą funkcji, po prostu muszę je dostarczyć, a podpowiedź zrobi swoją magię? –

+0

@Kronos: "Argumenty" są obsługiwane w funkcji, tak. Gdzieś w kodzie 'usort()' jest linia typu: '$ pos = $ callback ($ arr [0], $ arr [1]);'. To tam pochodzą argumenty, kiedy twoja funkcja jest wywoływana. (Uwaga: Właśnie stworzyłem ten wiersz jako przykład, to nie jest * dosłownie * w kodzie usort().) –

1

Twoje pytanie nie dotyczy tak naprawdę funkcji anonimowych, ale także przekazywania mulistych.

Weźmy pierwszy z was przykłady pod uwagę

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

Załóżmy, byłaby to trochę zastępując funkcję anonimową z funkcji o nazwie.

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

usort($array, 'comapreAB'); 

Jak widać nadal można zapytać, jak $a i $b są przekazywane.

Cóż, odpowiedź jest bardzo prosta. usort oczekuje, że przekażesz wywołanie, które zajmie 2 argumenty i wywoła je wewnętrznie.

+0

, ale dzieje się tak tylko w wbudowanych funkcjach php? W jaki sposób zadziała zdefiniowana przez użytkownika funkcja wywołania? –