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

关于php.net的问题';s关于匿名函数的教程,php,Php,PHP.net的示例3让我陷入了一个循环 第一个echo语句打印$message的值,尽管文档让我相信这是行不通的 闭包也可以从父范围继承变量。任何此类变量都必须传递给use language构造: 输出不是失败,而是: Notice: Undefined variable: message in /example.php on line 6 NULL string(5) "hello" 在第3条echo语句之前,将显示: $message = 'world'; 然后,echo再次调用函数$

PHP.net的示例3让我陷入了一个循环

第一个echo语句打印$message的值,尽管文档让我相信这是行不通的

闭包也可以从父范围继承变量。任何此类变量都必须传递给use language构造:

输出不是失败,而是:

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将“重置”为“hello”。再次调用Echo,但这次函数$example引用了$message:

$example = function () use (&$message) {
    var_dump($message);
};
输出为
字符串(5)“世界”
。我一点也不明白。我以为消息的值已经重置为hello

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

示例输出 第一个回声示例 从示例代码中,第一个
echo
语句似乎只是导致
NULL
,因为此匿名函数没有包含
use
。(通过
通知
可以知道
$message
未定义。)

以下是参考资料:

$message = 'hello';

// No "use"
$example = function () {
    var_dump($message);
};
echo $example();
// 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();
第五个回声示例 当
$message
的值被重置为
hello
时,以下代码部分:

// Inherit by-reference
$example = function () use (&$message) {
    var_dump($message);
};
echo $example();
显示继承了
$message
,这意味着当
$message='world'时稍后使用,我们现在引用(并将
“world”
)与前面相同的
$message
变量

换句话说,当我们定义
$example
函数时,我们指向内存中的原始
$message
变量(通过
和$message
引用)。因此,当我们稍后在代码中调用
$example()
时,我们引用的是相同的原始
$message
变量(我们最近也用
$message='world';
行更改了该变量)。这意味着
$example()
将输出当前的
$message
值(当前设置为
“world”
),而不是以前设置的值

以下是参考资料:

$message = 'hello';

// No "use"
$example = function () {
    var_dump($message);
};
echo $example();
// 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();

我认为您可能混淆了
var\u 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”

在继续下一个示例之前,将消息重置为“hello”

$message='hello'

当使用
&$message
定义时,这表示“使用
$message
当前值”和保留定义函数时
$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"

嗯,第一个echo语句不是
NULL
?第一个语句只会导致NULL-
注意:未定义变量:message
,它告诉您它“失败”。它不会产生致命的错误,也不会单独从中得到“你好”。我希望是这样。它仍然打印
string(5)“hello”
在这个粘贴箱中,我已经对echo语句进行了编号:。如果我注释掉第一个echo语句,空警告就会消失,但是(据我所知)第一个var_转储仍然打印$message的值,“hello”。谢谢。您对输出的编号鼓励我重新评估代码示例。这只是我使用PHP的第二天-我没有考虑到$example的最后一个调用是打印到输出。没问题!如果您在第二天开始使用匿名函数,那么您已经走得相当远了:)
$message = 'world';
echo $example(); // Result = string(5) "world"