JavaScript'te, hemen çalıştırılan anonim işlevleri tanımlayabilirsiniz:
(function () { /* do something */ })()
PHP'de böyle bir şey yapabilir misin?
JavaScript'te, hemen çalıştırılan anonim işlevleri tanımlayabilirsiniz:
(function () { /* do something */ })()
PHP'de böyle bir şey yapabilir misin?
Yanıtlar:
PHP7 için: Yasuo Ohgaki'nin cevabına bakın :(function() {echo 'Hi';})();
Önceki sürümler için: Aklıma gelen bunları hemen çalıştırmanın tek yolu
call_user_func(function() { echo 'executed'; });
call_user_func
In PHP 7
yapmak javascript aynıdır
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Çıktı:
1
2
3
Tabii ki kullanabilirsiniz call_user_func
, ancak yine de oldukça basit bir alternatif var:
<?php
// we simply need to write a simple function called run:
function run($f){
$f();
}
// and then we can use it like this:
run(function(){
echo "do something";
});
?>
run
İşlevinizi kodun başka bir bölümünde çağıramazlar çünkü işlevinizin hemen onu çalıştıran satırdan sonra var olan hiçbir tanıtıcısı yoktur.
run()
, kendisine aktarılan isimsiz işlevi hemen yürütmektir. Aynı şekilde call_user_func()
, yalnızca hiçbir parametre aktarılmaz.
$f();
ve kullandığınız motor call_user_func
, yalnızca bir fonksiyon argümanına sahip özel durum için optimize etmezse daha hızlı olabilir . Bunun nedeni call_user_func
, birden çok parametrenin iletilmesini desteklemesidir ve ilk bağımsız değişkeni, bağımsız değişken olarak bir dizeyi veya bir işlevi desteklemektedir. Bununla birlikte call_user_func
, çok okunaklıysa, run
kod piramidin altında bir yerde bulunmadıkça kullanmam .
run
ve call_user_func
. call_user_func
ile karşılaştırıldığında doğal bir dezavantajı vardır run
çünkü run
tek bir şey yapar, oysa call_user_func
ne yaptığını yapmanın yanı sıra ek özellikleri destekler run
. Motorunuzda hangisinin daha hızlı olduğunu görmek için hızlı bir döngü testi ( örneğin ) deneyebilirsiniz .
Bu, PHP 7.0 veya sonrası için en basit olanıdır.
php -r '(function() {echo 'Hi';})();'
Kapanış yaratmak anlamına gelir, ardından "()" izleyerek onu işlev olarak çağırır. Tek tip değişken değerlendirme sıralaması sayesinde JS gibi çalışır.
Unutmayın, kabul edilen cevap iyidir, ancak bir işlevi bildirip iki satırda çağırmaktan 1,41 kat daha uzun (% 41 daha yavaş) sürer.
[Bunun gerçekten yeni bir cevap olmadığını biliyorum, ancak bunu ziyaretçiler için bir yere eklemenin değerli olduğunu hissettim.]
Detaylar:
<?php
# Tags: benchmark, call_user_func, anonymous function
require_once("Benchmark.php");
bench(array(
'test1_anonfunc_call' => function(){
$f = function(){
$x = 123;
};
$f();
},
'test2_anonfunc_call_user_func' => function(){
call_user_func(
function(){
$x = 123;
}
);
}
), 10000);
?>
Sonuçlar:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Bunu bu şekilde denedim, ancak önce işlevi tanımlamanıza izin veren herhangi bir operatör (veya işlevi) kullanarak en üstteki cevaptan daha ayrıntılı:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Bu doğrudan bir cevap değil, geçici bir çözüm. PHP> = 7. Adsız bir sınıfın adlandırılmış bir yöntemle tanımlanması ve sınıfın oluşturulması ve yöntemi hemen çağırılması.
$var = (new class() { // Anonymous class
function cool() { // Named method
return 'neato';
}
})->cool(); // Instantiate the anonymous class and call the named method
echo $var; // Echos neato to console.
call_user_func(function(){/* stuff */})
oluyor?