如何在PHP的闭包函数中更改范围之外的变量的值

你使用过多少次未设计的工具?很难计数不是吗?有时使用非常复杂的PHP库, 但同时又不能满足你的所有要求, 因此在满足这些要求时会遇到问题。闭包是一个单独的命名空间, 通常情况下, 你无法访问此命名空间之外定义的变量。这就是use关键字的来源, 它使范围之外的变量在闭包内部可用, 例如:

< ?phpfunction some_function_that_expect_closures($callback){if (is_callable($callback)) {$returnValue = http://www.srcmini.com/call_user_func($callback); } return $returnValue; }$variableOutside = array("a" => 1, "b" => 2); $returnedValue = http://www.srcmini.com/some_function_that_expect_closures(function() use ($variableOutside){ // array(2) { ["a"]=> int(1) ["b"]=> int(2) } var_dump($variableOutside); return "Hello World"; }); // string(11) "Hello World"var_dump($returnedValue);

使用闭包的库中最常见的问题之一是, 初学者无法从PHP闭包的范围之外更新变量的值, 例如:
< ?phpfunction libraryWithCallback($callback){if (is_callable($callback)) {$argument = "cheese"; $returnValue = http://www.srcmini.com/call_user_func($callback, $argument); }}$myVariable ="nachos"; libraryWithCallback(function($newValue) use ($myVariable){// Assign "cheese" tovariable$myVariable = $newValue; }); // Prints "nachos"echo $myVariable;

上一个代码片段的目标是通过回调函数(闭包)简单地更改$ myVariable的值。 PHP的初学者只会认为$ myVariable的值现在是” cheese” , 但这不是由于闭包的工作方式引起的。
在闭包内更改变量的值听起来很简单, 你可以通过在闭包外更改变量的值, 方法是将其作为引用传递, 而不是在use语句中的变量前加上&并将其作为副本(使变量在闭包内可用)。如PHP的官方文档所示, 通过引用传递变量的语法如下:
< ?phpfunction foo(& $var){$var++; }$a = 5; foo($a); // $a is 6 here

因此, 在我们的闭包内部示例中, 你可以简单地在外部更新变量的值, 使其在使用范围内可用, 并将其通过引用前缀&传递给变量:
< ?phpfunction libraryWithCallback($callback){if (is_callable($callback)) {$argument = "cheese"; $returnValue = http://www.srcmini.com/call_user_func($callback, $argument); }}$myVariable ="nachos"; libraryWithCallback(function($newValue) use (& $myVariable){// Assign "cheese" tovariable$myVariable = $newValue; }); // Prints "cheese"echo $myVariable;

请注意, 可以在闭包内分配任何值(不仅是标量值)而不会出现问题。
【如何在PHP的闭包函数中更改范围之外的变量的值】编码愉快!

    推荐阅读