对匿名函数的 use() 语句

use() statement on anonymous functions

使用它是一种不好的做法吗?

因为人们说全局变量是不好的做法,而且 use 会将变量从外部引入到函数中,所以它就像 global

这是它的样子

$a = 1;
$func = function() use($a){
  print $a;
};

在匿名函数的 "use" 参数中定义的任何参数都使用定义匿名函数时的值;所以他们必须在那一点存在;但是当调用函数时不需要传递它们(甚至不需要存在于调用者作用域中)。

function myFunctionCreator() {
    $a = 1; // Must exist for the `use` clause
    $func = function() use($a){
        echo $a, PHP_EOL;
    };
    return $func;
}

$myFunc = myFunctionCreator();
$a = 2;

$myFunc(); // echoes 1 (value of $a at the point where the function was created)

从上面的例子可以看出,$a在函数定义处的值为1,即使该处存在同名变量调用函数时,函数调用中使用的是原始$a(值为1)。


定义函数时,主参数定义中定义的参数不需要存在,但值必须在函数被调用时作为参数传递给函数。

function myFunctionCreator() {
    $a = 1; // Need not exist, and will be ignored
    $func = function($a) {
        echo $a, PHP_EOL;
    };
    return $func;
}

$myFunc = myFunctionCreator();
$value = 2;

$myFunc($value);  // echoes 2 (value of $a explicitly passed to the function call
                  //           at the time it is executed)

所以这两种类型的行为完全不同,它们结合起来的目的提供了完全不同的灵活性


正如 Rizier123 在他的评论中提到的,作为 "standard" 传递给匿名函数的参数可以有默认值、类型提示等,而 "use" 参数不能。

function myFunctionCreator() {
    $func = function(array $dataset = [1,2,3]) {
        foreach($dataset as $value) {
            echo $value, PHP_EOL;
        }
    };
    return $func;
}

$myFunc = myFunctionCreator();
$value = ['a','b','c'];

$myFunc($value);
$myFunc();
$myFunc(['x','y','z']);

或者(如第三个调用所示,可以直接传递参数。

安迪将这些应用于 "use" 参数将导致解析错误