关于php.net匿名函数教程的问题

时间:2015-06-24 17:43:04

标签: php

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"。我根本不明白这一点。我认为消息的值已被重置为你好?

为什么第一个回声仍然有效?为什么第四个打印“世界”?

2 个答案:

答案 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,因为此匿名函数不包含useNotice告诉您$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"