【问题标题】:PHP "use" over additional parameters for closures?PHP“使用”闭包的附加参数?
【发布时间】:2016-10-22 00:22:56
【问题描述】:

在什么情况下使用 use 关键字和闭包比只向闭包传递额外的参数更有益?

示例 #1:

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

示例 #2:

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

就像它可能依赖的所有事情一样,但我看不出两者之间有任何功能差异。谁能提出一种情况或示例,其中一个示例优于另一个示例?

【问题讨论】:

  • FWIW,如果你不使用use,那么它不是闭包。

标签: php closures


【解决方案1】:

我看不出两者之间有任何功能差异。

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

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

另见In PHP 5.3.0, what is the function "use" identifier?


*:通过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

【讨论】:

  • 好的,现在我明白了。在问这个问题之前,我实际上通读了您提供的链接,但是在关于范围的部分中,我只是解释为函数中的范围与我理解的函数外部不同。我没有意识到use 子句中传递的值是在声明时而不是在调用时传递变量的值。再次阅读答案,我想这就是他们所说的“早期绑定”。谢谢你的回答,现在更有意义了。
【解决方案2】:

假设您正在使用带有预定义参数的闭包,例如 preg_replace_callback,并且您想在代码中的其他位置使用变量,您可以使用 use 关键字

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

这是在带有预定义参数的闭包内使用变量的好方法,这些参数无法访问闭包外的变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多