PHP闭包:使用关键字和函数定义:要使用的对象参数:未复制参数

PHP闭包:使用关键字和函数定义:要使用的对象参数:未复制参数,php,closures,anonymous-function,anonymous,Php,Closures,Anonymous Function,Anonymous,下面的代码是对中的示例稍加修改的版本 该示例提到但没有解释为什么不能按值传递PHP对象 函数中use关键字后的参数列表。在巴黎,为什么不是呢 使用参数列表中的值传递的对象,如下代码所示 复制到$breaked匿名函数中,就像可以使用标量值一样 代码如下: 谢谢 这是我在收到瓦伦丁·罗迪金的回复后的更新。 如果$myInstance=null;行被注释掉,我得到以下错误: Notice: Undefined variable: myInstance in C:\xampp\htdocs\my

下面的代码是对中的示例稍加修改的版本

该示例提到但没有解释为什么不能按值传递PHP对象 函数中use关键字后的参数列表。在巴黎,为什么不是呢 使用参数列表中的值传递的对象,如下代码所示 复制到$breaked匿名函数中,就像可以使用标量值一样

代码如下:

谢谢


这是我在收到瓦伦丁·罗迪金的回复后的更新。 如果$myInstance=null;行被注释掉,我得到以下错误:

Notice: Undefined variable: myInstance in C:\xampp\htdocs\myexamples\use.php on line 11
基本上,当use关键字的参数按值传递时,它会在 定义使用use关键字的函数的时间,而不是定义函数的时间 调用使用use关键字的。这同样适用于以下变量: 通过引用传递,但由于它们是通过引用传递的,因此以后的任何修改 在调用函数之前,将该变量的值更新为 函数内部可用的变量


谢谢。

让我们仔细看看您的代码

$myInstance = null;
$broken = function() use ($myInstance) {
    if(!empty($myInstance)) $myInstance->doSomething();
    else echo "\$myInstance is empty.\n";
    var_dump($myInstance); // NULL
};
此时,您已经创建了一个闭包,并在那里传递了变量的副本,该副本为空

$working = function() use (&$myInstance) {
    if(!empty($myInstance)) $myInstance->doSomething();
    else print "\$myInstance is empty.\n";
};

在这里,您传递了一个引用,因此稍后,当您实例化$myInstance时,可以在闭包中访问它。

谢谢。我更新了我的帖子,以反映你在回答中给出的解释。当做
$working = function() use (&$myInstance) {
    if(!empty($myInstance)) $myInstance->doSomething();
    else print "\$myInstance is empty.\n";
};