你使用过多少次未设计的工具?很难计数不是吗?有时使用非常复杂的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的闭包函数中更改范围之外的变量的值】编码愉快!
推荐阅读
- 如何使用Symfony 1.4返回JSON响应
- 如何在Symfony 1.4中获取并显示无效表单的所有错误
- 如何从SQL Server Management Studio中的多个备份(bak)文件还原数据库
- 修复Twig_Error_Runtime无法在Silex中加载”Symfony\Component\Form\FormRenderer”运行时
- 如何使用sfGuardPlugin在Symfony 1.4中手动登录用户
- 如何在不使用C语言的sqrt函数的情况下获得数字的平方根
- 如何在Symfony 4中注册自定义DQL函数(原则扩展)
- 如何建立有编码和无编码的电子学习网站()
- Android格式的日期为Datepicker的MM-DD-YYYY