PHP lambda neye yarar?

5 Cevap php

Lambda anonim işlev PHP 5.3 parçasıdır. Ne faydası var? Bir tek lambda ile yapabileceğimiz bir şey var mı? Lambda belirli görevler için iyi midir?

Ben Fibonacci örneğini gördüm ve ben gerçekten Fibonacci dizileri yazmaya gerek yok, bu yüzden ben hala ben webbish uygulamaları yazma karşılaştıkları görevlerin türlü bu çok yararlı eğer emin değilim. Yani bir "gerçek hayat" onunla ne yapar?

5 Cevap

Muhtemelen sadece bir kez kullanmak geçici bir işlev gerektiren bir şey.

Ben gibi fonksiyonlar için, geri aramalar için bunları kullanmak istiyorsunuz:

Örneğin

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

5.3 önce olurdu ..

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

Ya create_function ...

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

Anonim işlevler (kapaklar) (Dathan önerdiği gibi, böylece, küresel uzay pollluting değil) yerel işlevleri olarak oluşturulabilir.

"Kullanım" anahtar kelimesi ile geçirilen veya parça işlevi tarafından oluşturulan değişkenler kapatılması içinde kullanılabilir. Bu, parametre listesine sınırlıdır geri arama fonksiyonları çok yararlıdır. "Kullanım" değişkenleri onlara kapatma denir her zaman yeniden tanımlamak için ihtiyacı ortadan kaldırarak, kapatma dışında tanımlanabilir.

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);

(Tabii ki, bu örnek bir kapatma olmadan basit olabilir, ama bu sadece demo için.)

Lambdas tarafından daha rahat yapılan bazı kullanım durumları vardır. Örneğin, eğer bir yöntem bu geri çağırma bunu işlemek için bir yerde "gerçek" bir işlev tanımlamak zorunda kalmazsınız için bir lambda kullanarak, bir geri arama kullanır. Yani, lambdas kod temiz tutmak.

Yukarıda olduğu gibi, lambdas "kısa ömürlü" fonksiyon olarak kullanılabilir. Örneğin, sıralama algoritmaları genellikle sadece değişken a a ve b herhangi bir kombinasyonu için değişken b daha az olup olmadığını bilmek gerekir. Nesnelerinin herhangi bir sınıf taşıma kapasitesine sahip bir genel sıralama algoritması yapmak için, bir karşılaştırıcı olarak kullanmak için bir işlevi kabul sizin sıralama işlevi tanımı böyle yapmak olabilir. Karşılaştırıcı fonksiyonu olarak bir lambda sağlamak yerine, sadece bu bir sıralama durumda işlemek için komut dosyası ömür boyu yaşayacak bir "gerçek" işlevini tanımlamak yerine, bir çağrı başına bazda sıralama davranışını tanımlamak anlamına gelir.

Şifreli Y combinator uygulanması?

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);
    });
  });
}

Atıf Kaynak: http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures

Bir lambda fonksiyonları için aklınıza gelebilecek kullandığı her rağmen, PHP aynı zamanda çok özel bir şey denir kapatma sağlar. Bu uzun geçerli kapsamı mevcut durur sonra işlevi mevcut geçerli kapsamda değişkenleri yapmak için yeteneğidir.

Sadece kapatma sen, bir Memoization (Caching) ve Curry uygulamak sağlayan bazı yararlı desenleri söz.

Ayrıca çok kullanışlı Matt @ onun cevabını vurgulanan throw-away veya geri arama işlevleri vardır.

Kapanışları hakkında daha fazla bilgi için, bu soruyu kontrol edin: How do JavaScript closures work?