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

时间:2014-10-28 12:55:07

标签: php closures anonymous-function anonymous

以下代码是

中示例的略微修改版本

PHP Manual -> Language Reference -> Functions -> Anonymous functions

示例提到但不解释为什么不能按值传递PHP对象 到函数中use关键字后面的参数列表。特别是,为什么不呢 在use参数列表中按值传递的对象,如下面的代码所示 复制到$ broken匿名函数里面就像用标量值一样?

以下是代码:

class MyClass {

  function doSomething() { echo "HELLO WORLD\n"; }

}

$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 = new MyClass();

$myInstance->doSomething();    // Outputs HELLO WORLD.
$broken();                     // Outputs $myInstance is empty. NULL
$working();                    // Outputs HELLO WORLD.

感谢。


这是我收到Valentin Rodygin回复后对我帖子的更新。 如果$ myInstance = null; line被注释掉我收到以下错误:

Notice: Undefined variable: myInstance in C:\xampp\htdocs\myexamples\use.php on line 11

基本上,当use关键字的参数按值传递时,它将被复制到 时间定义了使用use关键字的函数,而不是函数时 调用use关键字。变量也是如此 通过引用传递,但因为它们是通过引用传递的,所以后来的任何修改 在调用函数之前对这样的变量进行更新后的值 函数内部可用的变量。

感谢。

1 个答案:

答案 0 :(得分:2)

让我们仔细看看你的代码。

$myInstance = null;
$broken = function() use ($myInstance) {
    if(!empty($myInstance)) $myInstance->doSomething();
    else echo "\$myInstance is empty.\n";
    var_dump($myInstance); // NULL
};

此时,您已经创建了一个闭包并传递了变量的副本,并且它是NULL。

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

在这里你传递了一个引用,所以稍后,当你实例化$ myInstance时,它会在闭包中被访问。