【问题标题】:PHP: Is there a difference in passing a variable to anonymous function, and using closure function?PHP:将变量传递给匿名函数和使用闭包函数有区别吗?
【发布时间】:2020-05-20 04:35:35
【问题描述】:

我了解 Lambda 和 Closure 函数所代表的含义,但我不了解 Closure 函数的必要性。
如果我们可以将变量传递给 Lambda 函数,那么对闭包函数有什么需求。看起来在调用函数时写变量名比写'use'然后定义它更容易。
例如,这两个将完全一样:

$string = 'string';
$lambda = function($string) {
    echo $string;
};
$lambda($string);
$string = 'string';
$closure = function() use ($string) {
    echo $string;
};
$closure();

...在我的理解中,第一个代码块是匿名(Lambda)函数,第二个是闭包。此外,更改函数内部的变量不会以两种方式影响函数外部的变量。
我发现了很多关于差异的问题,但没有一个解释了它的必要性。
谢谢你的回答。

【问题讨论】:

    标签: php function lambda closures


    【解决方案1】:

    当您无法控制正在传递的参数时,闭包函数很有用。例如,当您使用array_map 时,您不能添加额外的参数,它只接收数组元素。您可以使用闭包来访问其他变量。

    $string = "foo";
    $array = ["abc", "def"];
    $new_array = array_map(function($x) use ($string) {
        return $string . $x;
    }, $array);
    

    【讨论】:

      【解决方案2】:

      匿名函数,也称为闭包,允许创建 没有指定名称的函数。它们是最有用的 回调参数的值,但它们还有许多其他用途。匿名的 函数是使用 Closure 类实现的。

      echo preg_replace_callback('~-([a-z])~', function ($match) {
          return strtoupper($match[1]);
      }, 'hello-world');
      // outputs helloWorld
      

      闭包也可以从父作用域继承变量。任何此类 变量必须传递给use 语言结构。从 PHP 7.1 开始, 这些变量不得包含超全局变量、$this 或变量 与参数同名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        相关资源
        最近更新 更多