Когда я читал вопросы для 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
получил там значение!
функция z
создает и возвращает новую функцию, но анонимную. Эта новая функция определена так, что она имеет один аргумент — $y
, Тем не менее, эта анонимная функция также использует аргумент $x
из функции z
,
Чтобы сделать это простым, функция z
в основном создает функцию, которая может повторять любую строку, но фиксированное количество раз. Количество повторений строки определяется значением аргумента $x
в z
,
Итак, звоня z(2)
создает новую функцию, которая функционально эквивалентна записи
function repeat_two_times($y) {
return str_repeat($y, 2);
}
В вашем примере жестко закодированное значение 2 определяется значением $ x.
Вы можете прочитать больше об этом в документация. Принцип, показанный в примере, может быть весьма полезен для создания частичные функции как add5, inc10, …
Во-первых, вы инициализируете функцию z:
$a = z(2);
$x
в примере установлено значение 2, поэтому возвращаемая функция (анонимная функция, также называемая закрытием) теперь может читаться как (потому что $x
используется):
$a = function($y) {
return str_repeat($y, 2);
}
При вызове этой функции:
echo $a(3);
Вы предоставляете эту функцию возврата с параметром 3 ($y
).
Выход: 33
Анонимные функции также известны как 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 раза
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