web-dev-qa-db-ja.com

PHPでラムダはどのように使用されますか?

ラムダ匿名関数はPHP 5.3の一部です。どんな用途がありますか?ラムダでしかできないことはありますか?ラムダは特定のタスクに適していますか?

フィボナッチの例を見てきましたが、フィボナッチ数列を書く必要はまったくないので、Webbishアプリケーションの作成で遭遇する種類のタスクにそれが役立つかどうかはまだわかりません。それで、「現実の生活」でそれをどうするか?

55
user151841

おそらく一度しか使用しない一時関数を必要とするもの。

次のような関数のコールバックに使用します。

例えば。

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;'));
79
Matt

匿名関数(クロージャー)はローカル関数として作成できます(したがって、Dathanが提案したように、グローバル空間を汚染しません)。

「use」キーワードを使用すると、エンクロージング関数に渡されるか、エンクロージング関数によって作成された変数をクロージャー内で使用できます。これは、パラメーターリストで制限されているコールバック関数で非常に便利です。 「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);

(もちろん、この例はクロージャなしでよりシンプルにできますが、デモ用です。)

11
GZipp

ラムダによってより便利になったユースケースがいくつかあります。たとえば、メソッドがコールバックを使用する場合、そのコールバックにラムダを使用すると、それを処理するためにどこかに「実際の」関数を定義する必要がなくなります。したがって、ラムダはコードをよりきれいに保ちます。

上記と同様に、ラムダは「短命」関数として使用できます。たとえば、ソートアルゴリズムは通常、abの任意の組み合わせについて、変数aが変数bより小さいかどうかを知るだけで済みます。オブジェクトの任意のクラスを処理できる汎用の並べ替えアルゴリズムを作成するには、コンパレーターとして使用する関数を受け入れるように並べ替え関数定義を作成します。コンパレータ関数としてラムダを提供することは、この1つのソートケースを処理するためだけにスクリプトの存続期間にわたって存続する「実際の」関数を定義するのではなく、コールごとにソート動作を定義できることを意味します。

3
Dathan

すべての用途にもかかわらず、ラムダ関数について考えることができますが、PHPでは、クロージャーと呼ばれる非常に特別なものも許可されます。これは、現在のスコープは既存を停止します。

クロージャが許可するいくつかの有用なパターンに言及するだけで、 Memoization(Caching) および Curry を実装できます。

@Mattが答えで強調表示したthrow-awayまたはコールバック関数も非常に便利です。

クロージャーの詳細については、次の質問を確認してください。 JavaScriptクロージャーはどのように機能しますか?

3
7hi4g0

不可解な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

1
stormist