php - 闭包参数和 'use' 关键字有什么区别?

标签 php closures anonymous-function

这让我很困惑,我似乎无法找到这个问题的答案。一个清晰而简单的说明会很好。

最佳答案

use 语句 在创建闭包函数 时捕获变量

当函数被调用时,常规函数参数会捕获

请注意,我在此处区分了 variablevalue

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/

相关文章:

php - 如何从拥有数千个表的 mysql 数据库中选择 4 个随机表?

javascript - JS 闭包和函数参数

typescript - 使用 Promises 的类型 '{}' 上不存在属性

swift - 如何记录可选的闭包函数参数?

javascript - Typescript/Javascript 中的 Swift 闭包

python - 在 Scala 中如何近似 Python 的 or 运算符来进行集合比较?

scala - 匿名函数作为 scala 中的参数

javascript - Ajax 表单在当前页面提交

php - 何时在 Laravel 中使用双大括号?

php - 按最大计数聚合查询 (MYSQL)