Почему конструкция языка использования в php не может видеть изменения в значении переменной? - PullRequest
0 голосов
/ 10 января 2020

Я попал в главу анонимные функции в php Мануэль. В предыдущей главе объясняются два метода передачи переменных в функцию, а именно: передача по значению и передача по ссылке. Будучи javascript разработчиком, было очень неудобно видеть, что функции не имеют доступа к переменным, определенным в родительской области видимости. В любом случае, теперь они придумали третий способ передачи переменных в функцию - с помощью использования языковой конструкции . Пожалуйста, рассмотрите следующий пример:

$message = "hello";
$example = function () use ($message) {
    var_dump($message);
};
$example(); //prints hello, as expected.

$message = 'world';
$example(); //prints hello -- not world.

Последний вызов $example должен вывести "world", но при этом будет напечатано старшее значение $message. Это почему? Вместо этого, если бы мы использовали либо передачу по значению, либо передачу по ссылке, последний вызов функции имел бы напечатанный мир.

1 Ответ

3 голосов
/ 10 января 2020

Языковая конструкция use захватывает / копирует переданную переменную во время определения анонимной функции. Если вы измените эту переменную после определения функции, функция не заметит ее:

$foo = 'baz';

$f1 = function() use ($foo) {
    echo $foo;   
};

$foo = 'boo';

$f1(); // baz

Однако, если переменная является объектом, это правило не применяется, так как PHP передает объекты по ссылке *, всегда (* прочитайте комментарий Джето ниже для более точного описания):

$foo = new StdClass();
$foo->bar = 'baz';

$f2 = function() use ($foo) {
    echo $foo->bar;   
};

$foo->bar = 'boo';

$f2(); // boo

Я думаю, причина PHP имеет use для частичного применения функции:

function get_multiplier($factor) {
    return function($num) use ($factor) {
        return $num * $factor;
    };
}

$multiply_by_4 = get_multiplier(4);

echo $multiply_by_4(5); // 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...