这让我很困惑,我似乎无法找到这个问题的答案。一个清晰而简单的说明会很好。
最佳答案
use 语句
在创建闭包函数 时捕获变量。
当函数被调用时,常规函数参数会捕获值。
请注意,我在此处区分了 variable
和 value
。
function makeAnAdder($leftNum) {
// Notice that *each time* this makeAnAdder function gets called, we
// create and then return a brand new closure function.
$closureFunc = function($rightNum) use ($leftNum) {
return $leftNum + $rightNum;
};
return $closureFunc;
}
$add5to = makeAnAdder(5);
$add7to = makeAnAdder(7);
echo $add5to(10); // 15
echo $add7to(1); // 8
如果有一种方法可以检查 $add5to
函数的,嗯,“源代码”,它应该是这样的:
function($rightNum) {
return 5 + $rightNum;
}
我猜你可以说 $leftNum
的值被闭包函数记住了。
我想进一步强调,use 语句
允许您维护对变量 的引用
,而不仅仅是value 变量在某个时刻的值。阐明我的想法:将变量想象成一个小盒子,它可以在任何时刻及时包含一个值,并且该值可以更改。并且,您可以使另一个变量指向该框,以便您可以更新框中的值,或读取其中的当前值。
通常,在函数内创建的局部变量在函数返回后不复存在。但是,闭包函数可以维护对该变量的引用,并使该局部变量即使在函数返回后仍然存在——这就是闭包函数的真正威力。它让您只需少量代码即可模仿类的某些行为(实例变量)。
这是一个更高级的示例,可能需要深入思考才能理解行为的细节。
function makeBankAccount() {
// Each time this makeBankAccount func is called, a new, totally
// independent local variable named $balance is created.
$balance = 0;
// Also, on each call we create 2 new closure functions, $modifyBalance, and $getBalance
// which will hold a reference to the $balance variable even after makeBankAccount returns.
$modifyBalance = function($amount) use (&$balance) {
$balance += $amount;
};
$getBalance = function() use (&$balance) {
return $balance;
};
// return both closure functions.
return ['modifyBalance' => $modifyBalance, 'getBalance' => $getBalance];
}
// Let's prove that bank1 works by adding 5 to the balance by using the first
// function, then using the other function to get the balance
// from the same internal variable.
$bank1 = makeBankAccount();
$bank1['modifyBalance'](5);
echo $bank1['getBalance'](); // 5 - it works.
// Now let's make another bank to prove that it has it's own independent internal $balance variable.
$bank2 = makeBankAccount();
$bank2['modifyBalance'](10);
echo $bank2['getBalance'](); // 10 - as expected. It would have printed 15 if bank2 shared a variable with bank1.
// Let's test bank1 one more time to be sure that bank2 didn't mess with it.
echo $bank1['getBalance'](); // 5 - still 5, as expected.
您可能已经注意到我使用了 reference operator &
在这个例子中。如果您还不熟悉它们,只知道引用文献是众所周知的难以理解的。虽然,我希望这篇文章本身大部分都有意义。
关于php - 闭包参数和 'use' 关键字有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692817/