对匿名函数的 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" 参数将导致解析错误
使用它是一种不好的做法吗?
因为人们说全局变量是不好的做法,而且 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" 参数将导致解析错误