PHP: Есть ли разница в передаче переменной в анонимную функцию и использовании функции закрытия? - PullRequest
0 голосов
/ 04 февраля 2020

Я понимаю, что представляют собой функции Lambda и Closure, но я не понимаю необходимости в функциях Closure.
Зачем нужны функции Closure, если мы можем просто передать переменную в функции Lambda. Похоже, что проще написать имя переменной при вызове функции, чем написать «use» и затем определить ее.
Например, эти два будут делать то же самое:

$string = 'string';
$lambda = function($string) {
    echo $string;
};
$lambda($string);
$string = 'string';
$closure = function() use ($string) {
    echo $string;
};
$closure();

... и, насколько я понимаю, первый блок кода - это функция Anonymous (Lambda), а второй - Closure. Кроме того, изменение переменной внутри функции не повлияет на переменную вне ее в обоих направлениях.
Я нашел много вопросов о различиях, но ни один из них не объяснил необходимость этого.
Спасибо для ответов.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Функция закрытия полезна, когда у вас нет контроля над передаваемыми аргументами. Например, когда вы используете array_map, вы не можете добавить дополнительный параметр, он просто получает элементы массива. Вы можете использовать замыкание для доступа к дополнительным переменным.

$string = "foo";
$array = ["abc", "def"];
$new_array = array_map(function($x) use ($string) {
    return $string . $x;
}, $array);
0 голосов
/ 04 февраля 2020

Анонимные функции, также известные как замыкания, позволяют создавать функции без указанного имени. Они наиболее полезны в качестве значения параметров обратного вызова, но имеют много других применений. Анонимные функции реализуются с использованием класса Closure.

echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// outputs helloWorld

Замыкания также могут наследовать переменные из родительской области. Любые такие переменные должны быть переданы языковой конструкции use. Начиная с PHP 7.1, эти переменные не должны включать суперглобальные переменные, $ this или переменные с тем же именем, что и у параметра.

...