2014-11-26 19 views
5

Kiedy czytałem pytania do Zend Certified PHP Engineer 5.5, zobaczyłem pytanie o anonimową funkcję, ale muszę wyjaśnić, jak to działa.php Anonimowa funkcja

function z($x) 
{ 
    return function($y) use ($x) 
    { 
     return str_repeat($y , $x); 
    }; 
} 

$a = z(2); 
$b = z(3); 

echo $a(3).$b(2); 

Wyjście dla tego kodu jest:

33222 

Ale w nagłówku funkcji jest tylko $x parametr skąd $y tam wartość!

Odpowiedz

3

Funkcja z tworzy i zwraca nową funkcję, ale anonimowy jeden. Ta nowa funkcja jest zdefiniowana tak, aby miała jeden argument - $y. Jednak ta anonimowa funkcja używa również argumentu $x z funkcji z.

Aby to uczynić, funkcja z zasadniczo tworzy funkcję, która może powtarzać dowolny ciąg, ale określoną liczbę razy. Liczba powtórzeń ciągu jest określona przez wartość argumentu $x w z.

Więc, nazywając z(2) tworzy nową funkcję, która jest funkcjonalnie równoważne do pisania

function repeat_two_times($y) { 
    return str_repeat($y, 2); 
} 

w was przykład zakodowana wartość 2 jest określona przez wartość $ x.

Możesz przeczytać więcej na ten temat w documentation. Zasada wyświetlana w przykładzie może być całkiem przydatna do tworzenia partial functions takich jak add5, inc10, ...

2

Po pierwsze, zainicjować funkcję Z:

$a = z(2); 

$x w przykładzie jest ustawiony na 2, więc funkcja zwrócony (funkcja anonimowa, zwany także zamknięcie) można teraz odczytać jako (bo $x jest używany) :

$a = function($y) { 
    return str_repeat($y, 2); 
} 

Gdy wywoływanie tej funkcji:

echo $a(3); 

Dostarczasz tę funkcję zwrotu za pomocą parametru 3 ($y).

Wyjście jest: 33

1

Funkcje anonimowe są również znane jako Closures.

Pytasz, gdzie $y dostaje swoją wartość. Przykład kodu jest trudny do odczytania, ponieważ wszędzie używasz 2s i 3s. Wszystko będzie jaśniejsze, jeśli ostatnie linie były

$a = z(2); 
$b = z(3); 
echo $a('A').$b('B'); 

który powodowałby:

AABBB 

Ale bądźmy śledzić swój kod.Zauważ, że istnieją dwie funkcje związane wywołuje funkcję z()

$a = z(2); 

i

echo $a(3); 

wywołanie z argumentem 2 zwraca funkcja (który jest przypisany nazwę $a), gdzie linia

return str_repeat($y, $x); 

jest w rzeczywistość:

return str_repeat($y, 2); 

teraz, wywołać tą funkcję z argumentem $a() 3. To 3 (wartość $y) powtarza się dwa razy

Ta sama analiza odnosi się do innych związanych z wywołań funkcji:

$b = z(3); 
... 
echo ... $b(2); 

Ale w tym Przypadek 2 powtarza się 3 razy

0
function z($x) 
    { 
    return function($y) use ($x) 
    { 
     return str_repeat($y , $x); 
    }; 
    } 

    $a = z(2);// here you are setting value of x by 2 
    $b = z(3);// here you are setting value of x by 3 
echo $a(3).$b(2);// here $a(3) 3 is value of y so it becomes str_repeat(3 , 2); which is 33