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

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

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闭包的范围之外更新变量的值, 例如:

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的官方文档所示, 通过引用传递变量的语法如下:

function foo(&$var)

{

$var++;

}

$a = 5;

foo($a);

// $a is 6 here

因此, 在我们的闭包内部示例中, 你可以简单地在外部更新变量的值, 使其在使用范围内可用, 并将其通过引用前缀&传递给变量:

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;

请注意, 可以在闭包内分配任何值(不仅是标量值)而不会出现问题。

编码愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值