PHP анонимная функция

Когда я читал вопросы для Zend Certified PHP Engineer 5.5, я увидел вопрос об анонимной функции, но мне нужно объяснить, как она работает.

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

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

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

Выход для этого кода:

33222

Но в заголовке функции есть только $x параметр откуда $y получил там значение!

6

Решение

функция z создает и возвращает новую функцию, но анонимную. Эта новая функция определена так, что она имеет один аргумент — $y, Тем не менее, эта анонимная функция также использует аргумент $x из функции z,

Чтобы сделать это простым, функция z в основном создает функцию, которая может повторять любую строку, но фиксированное количество раз. Количество повторений строки определяется значением аргумента $x в z,

Итак, звоня z(2) создает новую функцию, которая функционально эквивалентна записи

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

В вашем примере жестко закодированное значение 2 определяется значением $ x.

Вы можете прочитать больше об этом в документация. Принцип, показанный в примере, может быть весьма полезен для создания частичные функции как add5, inc10, …

3

Другие решения

Во-первых, вы инициализируете функцию z:

$a = z(2);

$x в примере установлено значение 2, поэтому возвращаемая функция (анонимная функция, также называемая закрытием) теперь может читаться как (потому что $x используется):

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

При вызове этой функции:

echo $a(3);

Вы предоставляете эту функцию возврата с параметром 3 ($y).

Выход: 33

2

Анонимные функции также известны как Closures,

Вы спрашиваете, где $y получает свое значение. Пример кода трудно расшифровать, потому что вы используете 2 и 3 везде. Все было бы яснее, если бы ваши последние строки были

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

Это приведет к:

AABBB

Но давайте следовать вашему коду. Обратите внимание, что есть два связанных вызова функций

 $a = z(2);

а также

 echo $a(3);

вызывающая функция z() с аргументом 2 возвращает функцию (которой присвоено имя $a) где линия

 return str_repeat($y, $x);

на самом деле:

 return str_repeat($y, 2);

теперь вы вызываете эту функцию $a() с аргументом 3. Это 3 (значение $y) повторяется два раза

Тот же анализ применяется к другим вызовам связанных функций:

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

Но в этом случае 2 повторяется 3 раза

1

 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
0
По вопросам рекламы [email protected]