Soru PHP'deki anonim işlevleri neden ve nasıl kullanıyorsunuz?


Anonim işlevler PHP 5.3'ten edinilebilir.
Onları kullanmalı mıyım yoksa onlardan uzak mıyım? Öyleyse nasıl?

Düzenlenen; php anonim işlevleri ile bazı güzel hile buldum ...

$container           = new DependencyInjectionContainer();
$container->mail     = function($container) {};
$conteiner->db       = function($container) {};
$container->memcache = function($container) {};

44
2018-03-09 20:27


Menşei


Dostum, Bağımlılık Enjeksiyonunu hiç kullanmıyorum. - Kzqai
@Tchalvak, neden? Benim için olduğu gibi uygulamak ve kullanmak gerçekten çok kolay. Tuzak var mı? - Kirzilla
@Kirzilla $container = new DependencyInjectionContainer(); anonim işlevlerle ilgisi yok - Uzair Farooq


Cevaplar:


Anonim işlevler gerektiren işlevleri kullanırken yararlıdır geri çağırma işlevi sevmek array_filter veya array_map yap:

$arr = range(0, 10);
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; });
$arr_square = array_map(function($val) { return $val * $val; }, $arr);

Aksi halde, sadece bir kez kullanabileceğiniz bir fonksiyon tanımlamanız gerekir:

function isEven($val) { return $val % 2 == 0; }
$arr_even = array_filter($arr, 'isEven');
function square($val) { return $val * $val; }
$arr_square = array_map('square', $arr);

85
2018-03-09 20:36



Anonim işlevlerin amacı hakkında bulduğum en tutarlı cevap bu gibi görünüyor. Bir kerelik / bir-yer çözümlerinin çoğu için, anonim işlevlerin kodun, nerede kullanıldığı, bir yerde tanımlanması ve başka bir yere çağırılması gerekmeden, doğru yerde kalmasını sağladığının altını çiziyor. Bu, bir projede yüzlerce veya binlerce olarak sayılan tek seferlik işlevleriniz varsa, son derece yararlı olur. - trejder


Anonim işlevler PHP 5.3'ten edinilebilir.

Anonim fonksiyonlar uzun bir süredir PHP'de mevcuttur: create_function PHP 4.0.1'den beri etrafta. Ancak, PHP 5.3'ten itibaren yeni bir kavram ve sözdizimi olduğu konusunda oldukça haklısınız.

Onları kullanmalı mıyım yoksa onlardan uzak mıyım? Öyleyse nasıl?

Hiç kullandıysanız create_function önce, daha sonra yeni sözdizimi, onu kullandığınız yerde kolayca kaydırabilir. Diğer cevapların da belirttiği gibi, ortak bir durum, sadece bir kez (ya da en azından tek bir yerde) kullanılacakları “fırlatma” işlevleri içindir. Genel olarak, bu gibi şeyler için geri bildirimler şeklinde gelir. array_map/azaltmak/filtre, preg_replace_callback, usort, vb..

Harflerin harflerle görüntülenme sayısını saymak için anonim işlevlerin kullanılması örneği (bu, başka şekillerde de yapılabilir, bu sadece bir örnektir):

$array = array('apple', 'banana', 'cherry', 'damson');

// For each item in the array, count the letters in the word
$array = array_map(function($value){
    $letters = str_split($value);
    $counts  = array_count_values($letters);
    return $counts;
}, $array);

// Sum the counts for each letter
$array = array_reduce($array, function($reduced, $value) {
    foreach ($value as $letter => $count) {
        if ( ! isset($reduced[$letter])) {
            $reduced[$letter] = 0;
        }
        $reduced[$letter] += $count;
    }
    return $reduced;
});

// Sort counts in descending order, no anonymous function here :-)
arsort($array);

print_r($array);

Hangi verir (kıskançlık için snipped):

Array
(
    [a] => 5
    [n] => 3
    [e] => 2
    ... more ...
    [y] => 1
)

23
2018-03-09 21:20



Usort için +1, bu iyi bir kullanım. - Kzqai
@salathe Yani .. geri çağırma işlevleri ile çalışmaktan başka anonim işlevler işe yaramıyor mu? Sadece aldatmaca hakkında ne anlamadım - samayo


Belki de sadece PHP'nin makalesini okuyabilirsiniz. Anonim Fonksiyonlar. Aslında oldukça iyi.


9
2018-03-09 20:33



Hmmm, php belgeleri için, bu gerçekten iyi bir yazı. - Kzqai
Evet gerçekten çok iyi açıkladı - Rahat Ali


Anonim işlevler, DI kapsayıcısına işlev oluştururken de çok yararlı olabilir, örneğin "bootstrap.php":

//add sessions
$di->add("session",function(){ return new Session(); });
//add cache
$di->add("cache",function(){ return new Cache(); });
//add class which will be used in any request
$di->add("anyTimeCalledClass", new SomeClass());

Kullanım paramları ve sonraki değişkenler ile örnek

$di->add("myName",function($params) use($application){
      $application->myMethod($params);
});

Burada, anonim işlevleri nasıl kullanabileceğinizi, belleği ve sunucu yükünü nasıl kaydedeceğinizi görebilirsiniz. Tüm önemli eklentileri, sınıfları tanımlamış olabilirsiniz. di kapsayıcı, ancak örnekler ihtiyacınız varsa oluşturulacak.


4
2018-06-01 23:14



Merhaba @brasofilo, biraz daha açıklayabilir misiniz lütfen? Farkı anlayamıyorum. - San
@San farkı, kayıt olduğunuzda örnektir: $ di-> add ('service', new Object ()); Nesne örneği, di kapta saklanır. $ Di-> add ('service', işlev () {'i yeni nesne ();} döndürün; Nesnenin örneği "istek" üzerinde yaratılır, böylece fark, tüm hizmetleri di olarak kaydedebilmeniz ve kayıtlı servislerin belleğe zarar vermeyeceğidir, çünkü örnekler henüz oluşturulmamıştır. Birçok durumda dev'ler, hizmetlerin di ancak her istek üzerine kaydedilmesi hizmet yaratılır ve bu işlem yürütmeyi yavaşlatır. Anonim işleviniz olduğunda hiçbir şey oluşturulmaz. - Kamil
Çok teşekkür ederim! - San


Anonim işlevlerin tipik kullanımı geri arama işlevleridir. Örneğin, bunları işlev gibi sıralama algoritmalarından geri çağırmak için kullanabilirsiniz uksort ( http://lv.php.net/uksort gibi ya da preg_replace_callback ( http://lv.php.net/manual/en/function.preg-replace-callback.php ). Kendimi PHP'de denemedim, bu sadece bir tahmin.


2
2018-03-09 20:30





Php anonim işlevlerini kullanarak örnek örnek İşte

$suppliers=['add1'=>'nodia','add2'=>'delhi', 'add3'=>'UP'];
 $getAddress = function($suppliers){ $address=[];
 for($i=1;$i<5;$i++){
  if(array_key_exists('add'.$i, $suppliers))
    $address[]=$suppliers['add'.$i];
  }
 return $address;};
 print_r($getAddress($suppliers));

Yukarıdaki örnekte, girilen dizide bir anahtar olup olmadığını kontrol eden anonim işlevler yazdık. Varsa, bunu çıktı dizisine koyar.


0
2018-01-24 07:14