PHP 中的 lambda 有什么用?

问题描述 投票:0回答:6

lambda 匿名函数是 PHP 5.3 的一部分。它有什么用呢?有什么事情只能用 lambda 来做吗? lambda 是否更适合某些任务?

我已经看过斐波那契示例,而且我真的不需要编写斐波那契序列,所以我仍然不确定它对于我在编写 webbish 应用程序时遇到的各种任务是否有用。那么人们在“现实生活”中用它做什么呢?

php lambda
6个回答
90
投票

任何需要临时功能的东西,您可能只会使用一次。

我会将它们用于回调,例如:

例如

usort($myArray, function ($a, $b) {
    return $a < $b;
});

5.3 之前,你必须..

function mySort ($a, $b) {
    return $a < $b;
}
usort($myArray, 'mySort');

或者create_function ...

usort($myArray, create_function('$a, $b', 'return $a < $b;'));

12
投票

匿名函数(闭包)可以创建为本地函数(因此不会污染全局空间,如 Dathan 所建议的)。

使用“use”关键字,传递给封闭函数或由封闭函数创建的变量可以在闭包内使用。这对于参数列表有限的回调函数非常有用。 “使用”变量可以在闭包外部定义,从而无需在每次调用闭包时重新定义它们。

function change_array($arr, $pdo)
{
    $keys = array('a', 'c');
    $anon_func = function(& $val, $key) use ($keys, $pdo)
    {
         if (in_array($key, $keys) {
            $pdo->query('some query using $key');
            $val = $pdo->fetch();
        }
    }
    arr_walk($arr, $anon_func);
    return $arr;
}

$pdo = new($dsn, $uname, $pword);
$sample = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$sample = change_array($sample, $pdo);

(当然,这个例子没有闭包还可以更简单,但这只是为了演示。)


4
投票

有些用例通过 lambda 变得更加方便。例如,如果一个方法使用回调,则为该回调使用 lambda 意味着您不必在某处定义“真实”函数来处理它。因此,lambda 可以让您的代码更加简洁。

与上面一样,lambda 可以用作“短期”函数。例如,排序算法通常只需要知道对于

a
b
的任意组合,变量
a
是否小于变量
b
。要创建能够处理任何类对象的通用排序算法,您可以定义排序函数,使其接受用作比较器的函数。提供 lambda 作为比较器函数意味着您可以在每次调用的基础上定义排序行为,而不必定义一个“真实”函数,该函数将在脚本的整个生命周期中存在,只是为了处理这种排序情况。


4
投票

尽管 lambda 函数有很多用途,但在 PHP 中它还允许一些非常特殊的东西,称为闭包。这就是在当前作用域停止存在很久之后,使当前作用域中的变量可供函数使用的能力。

仅提一下闭包允许您使用的一些有用模式,可以实现Memoization(缓存)Curry

@Matt 在他的答案中强调的扔掉或回调函数也非常有用。

有关闭包的更多信息,请查看以下问题:JavaScript 闭包如何工作?


1
投票

神秘的 Y 组合器的实现?

function Y($F)
{
  $func = function ($f) { return $f($f); };

  return $func(function ($f) use($F)
  {
    return $F(function ($x) use($f)
    {
      $ff = $f($f);

      return $ff($x);
    });
  });
}

引用来源:http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures


0
投票

您可以使用名为“array_filter”的内置 PHP 函数,而不是 lambda 函数。

© www.soinside.com 2019 - 2024. All rights reserved.