你使用过多少次未设计的工具?很难计数不是吗?有时使用非常复杂的PHP库, 但同时又不能满足你的所有要求, 因此在满足这些要求时会遇到问题。闭包是一个单独的命名空间, 通常情况下, 你无法访问此命名空间之外定义的变量。这就是use关键字的来源, 它使范围之外的变量在闭包内部可用, 例如:
<?php
function some_function_that_expect_closures($callback){
if (is_callable($callback)) {
$returnValue = call_user_func($callback);
}
return $returnValue;
}
$variableOutside = array(
"a" => 1, "b" => 2
);
$returnedValue = 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闭包的范围之外更新变量的值, 例如:
<?php
function libraryWithCallback($callback){
if (is_callable($callback)) {
$argument = "cheese";
$returnValue = 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的官方文档所示, 通过引用传递变量的语法如下:
<?php
function foo(&$var)
{
$var++;
}
$a = 5;
foo($a);
// $a is 6 here
因此, 在我们的闭包内部示例中, 你可以简单地在外部更新变量的值, 使其在使用范围内可用, 并将其通过引用前缀&传递给变量:
<?php
function libraryWithCallback($callback){
if (is_callable($callback)) {
$argument = "cheese";
$returnValue = call_user_func($callback, $argument);
}
}
$myVariable = "nachos";
libraryWithCallback(function($newValue) use (&$myVariable){
// Assign "cheese" tovariable
$myVariable = $newValue;
});
// Prints "cheese"
echo $myVariable;
请注意, 可以在闭包内分配任何值(不仅是标量值)而不会出现问题。
编码愉快!
评论前必须登录!
注册