PHP.net的例子3 documentation on anonymous functions引发了我一个循环。
第一个echo语句打印$ message的值,即使文档让我相信这不起作用。
闭包还可以从父作用域继承变量。必须将任何此类变量传递给use语言构造。 :
// No "use"
$example = function () {
var_dump($message);
};
echo $example();
输出是:
,而不是失败Notice: Undefined variable: message in /example.php on line 6
NULL
string(5) "hello"
在第3个echo语句之前,会出现:
$message = 'world';
然后,echo再次调用函数$ example来获取$ message的值。输出再次为string(5) "hello"
,而不是string(5) "world"
。由于$ message是在定义$ example时定义的,因此echo语句仍返回string(5) "hello"
。我明白了。
接下来,$ message被“重置”为“你好”。再次调用Echo,但这次函数$ example有一个对$ message的引用:
$example = function () use (&$message) {
var_dump($message);
};
输出为string(5) "world"
。我根本不明白这一点。我认为消息的值已被重置为你好?
为什么第一个回声仍然有效?为什么第四个打印“世界”?
答案 0 :(得分:1)
Notice: Undefined variable: message in /example.php on line 6
1: NULL
2: string(5) "hello"
3: string(5) "hello"
4: string(5) "hello"
5: string(5) "world"
6: string(11) "hello world"
从示例代码中,第一个echo
语句似乎只会导致NULL
,因为此匿名函数不包含use
。 (Notice
告诉您$message
未定义。)
以下是relevant code in context供参考:
$message = 'hello';
// No "use"
$example = function () {
var_dump($message);
};
echo $example();
虽然$message
的值已重置为hello
,但以下代码部分为:
// Inherit by-reference
$example = function () use (&$message) {
var_dump($message);
};
echo $example();
表明$message
是继承的by reference,这意味着稍后使用$message = 'world';
时,我们现在引用(并指定"world"
)与之前的$message
变量相同。
换句话说,当我们定义$example
函数时,我们指向内存中的原始$message
变量(通过&$message
引用)。因此,当我们稍后在代码中调用$example()
时,我们指的是相同的原始$message
变量(我们最近也使用$message = 'world';
行进行了更改)。这意味着$example()
会输出我们当前的$message
值(目前设置为"world"
),而不是之前设置的值。
以下是relevant code in context供参考:
// Reset message
$message = 'hello';
// Inherit by-reference
$example = function () use (&$message) {
var_dump($message);
};
echo $example();
// The changed value in the parent scope
// is reflected inside the function call
$message = 'world';
echo $example();
答案 1 :(得分:1)
我认为你可能混淆了导致混淆的var_dump
值。让我们分解每一个:
最初设置消息
$message = 'hello';
定义功能。使用$message
作为当前值
在定义函数时。所以在这里,除非重新定义$example
,否则输出将始终为string(5) "hello"
,因为这是定义函数时设置的$message
。
$example = function () use ($message) {
var_dump($message);
};
echo $example(); // Result = string(5) "hello"
即使我们切换$message
的值
原始函数使用$message
时的值
函数已定义,因此string(5) "hello"
$message = 'world';
echo $example(); // Result = string(5) "hello"
将消息重置为"你好"在继续下一个例子之前
$message = 'hello';
使用&$message
定义时,这就是说"使用$message
"的当前值并且 NOT 在定义函数时保留$message
的值。因此,由于$message
当前设置为"hello"
,因此该函数代表该值。如果我们将$message
更改为其他内容并再次运行该函数,它将转储所设置的$message
值。
$example = function () use (&$message) {
var_dump($message);
};
echo $example(); // Result = string(5) "hello"
这表示当值在外部更改时,函数中会更新&$message
值。
$message = 'world';
echo $example(); // Result = string(5) "world"