Php Can';不理解函数和引用行为

Php Can';不理解函数和引用行为,php,Php,我有这个密码 $add = (function () { $counter = 0; return function () use(&$counter) {return $counter += 1;}; })(); echo $add(); //1 echo $add(); //2 echo $add(); //3 预期产出: 111 原始输出: 123 在函数内部,$counter=0由0赋值,因此和$counter应为0 所以当我第二次调用它时,它会看到$co

我有这个密码

$add = (function () {
    $counter = 0;
    return function () use(&$counter) {return $counter += 1;};
})();

echo $add(); //1
echo $add(); //2
echo $add(); //3
预期产出:

111
原始输出:

123
在函数内部,
$counter=0
由0赋值,因此
和$counter
应为0
所以当我第二次调用它时,它会看到
$counter=0
,所以
&$counter将是0
,不是吗?
为什么它在增加?

你说的“看到”是什么意思?第一次执行
$add()
,内部计数器将被计数。当您使用参考指针时(通过在
使用(&$counter)
中添加符号)到原始
$counter
,也会对其进行操作,因此执行一次后,计数器变量不再包含零


删除该符号时,最里面的函数每次都使用一个新的计数器,这样就满足了预期的输出

它不会第二次调用$counter=0。在启动第一个函数时只调用一次。调用$add()时,每次调用第二个函数(即返回语句中的函数)时,都会调用该函数,该函数只使用通过引用传递的修改后的$counter值。如果要添加
echo$计数器$counter=0后的code>
您将看到。

因为您传递了对函数的引用,初始值
$counter=0$counter+=1向其添加1时,代码>值也会增加这就是为什么你的结果是“123”


要获得“111”,您需要将变量传递给函数
$counter
,而不是引用。

我的主要疑问是,我知道函数内部的变量在局部范围内,执行函数后,这些变量会被删除。所以,当我第二次调用它时,$计数器如何具有以前的值!你说的“局部范围”是什么意思?通过将
$counter
作为引用传递,您没有两个称为
$counter
的不同变量,只有一个。第二个是指向第一个的指针