gpt4 book ai didi

php - 为什么php中的使用语言构造无法看到变量值的变化?

转载 作者:行者123 更新时间:2023-12-04 16:59:05 24 4
gpt4 key购买 nike

我已经到了anonymous functions的章节在 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 的旧值.这是为什么?相反,如果我们使用按值传递或按引用传递,最后一个函数调用将打印世界。

最佳答案

use语言构造在定义匿名函数时捕获/复制传递的变量。如果在函数定义之后更改该变量,函数将不会注意到它:

$foo = 'baz';

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

$foo = 'boo';

$f1(); // baz

但是,如果变量是对象,则此规则不适用,因为 PHP 通过引用传递对象*,始终(* 阅读下面 Jeto 的评论以获得更准确的描述):
$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

关于php - 为什么php中的使用语言构造无法看到变量值的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com