PHP“use"关于闭包的其他参数


PHP "use" over additional parameters for closures?

在什么情况下,将use关键字与闭包一起使用比将附加参数传递给闭包更有益?

示例# 1:

$myClosure = function($var1, $var2) use ($var3){
//Some code
}

例2:

$myClosure = function($var1, $var2, $var3){
//Some code
}
就像所有的事情一样,这可能要视情况而定,但我看不出两者在功能上有什么区别。谁能提出一种情况或例子,其中一个例子会优于另一个?

我看不出两者在功能上有什么区别。

参数由函数的调用者提供。如果是调用者并且可以提供所有必要的参数,那么基本上没有区别*。

但是,您可能在其他地方传递函数,因此您是而不是调用者,并且控制传递的参数。这就是闭包解决的问题:您可以在不调用函数的情况下使值可用。

参见在PHP 5.3.0中,函数"use"是什么?标识符?.


*:通过use绑定的变量在定义时定义。因此,如果变量的值发生了变化,就会产生差异:

$a = 1;
$b = 2;
$c = 3;
$f1 = function($a, $b) use ($c) {
  echo $a, $b, $c;
};
$f2 = function($a, $b, $c) {
  echo $a, $b, $c;
};
$c = 42;
$f1($a, $b); // 1, 2, 3
$f2($a, $b, $c); // 1, 2, 42

假设您正在使用具有预定义参数的闭包,例如preg_replace_callback,并且您希望在代码中使用来自其他地方的变量,您将使用use关键字

$myvar = "hello";
$text = "";
$text = preg_replace_callback('/regex/', function($matches) use ($myvar) {
  return $myvar . " " . $matches[1] . "!";
}, $text);

在具有预定义参数的闭包内使用变量是一种很好的方法,这些参数不能访问闭包外的变量