Di JavaScript, Anda dapat menentukan fungsi anonim yang dijalankan segera:
(function () { /* do something */ })()
Bisakah Anda melakukan hal seperti itu di PHP?
Di JavaScript, Anda dapat menentukan fungsi anonim yang dijalankan segera:
(function () { /* do something */ })()
Bisakah Anda melakukan hal seperti itu di PHP?
Jawaban:
Untuk PHP7: lihat jawaban Yasuo Ohgaki :(function() {echo 'Hi';})();
Untuk versi sebelumnya: satu-satunya cara untuk menjalankannya dengan segera yang dapat saya pikirkan adalah
call_user_func(function() { echo 'executed'; });
call_user_func
In PHP 7adalah melakukan hal yang sama di javascript
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Outputnya adalah:
1
2
3
Tentu saja Anda dapat menggunakan call_user_func, tetapi masih ada alternatif lain yang cukup sederhana:
<?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";
});
?>
runfungsi Anda di beberapa bagian lain dari kode karena tidak ada pegangan ke fungsi Anda yang ada setelah baris yang segera mengeksekusinya.
run()adalah untuk segera menjalankan fungsi tanpa nama yang diteruskan ke sana. Sama seperti call_user_func(), hanya tidak ada parameter yang dilewatkan.
$f();dan mungkin lebih cepat jika mesin yang Anda gunakan tidak mengoptimalkan untuk kasus khusus di mana call_user_funchanya memiliki satu argumen fungsi. Ini karena call_user_funcmendukung penerusan beberapa parameter dan argumen pertamanya mendukung string sebagai argumen atau fungsi. Yang mengatakan, jika call_user_funclebih mudah dibaca, saya tidak akan menggunakan runkecuali kode tersebut terletak di suatu tempat di bagian bawah piramida .
rundan call_user_func. call_user_funcmemiliki kelemahan inheren jika dibandingkan runkarena runhanya melakukan satu hal, sedangkan call_user_funcmendukung fitur tambahan selain melakukan apa yang rundilakukannya. Anda dapat mencoba tes putaran cepat ( mis. ) Untuk melihat mana yang lebih cepat pada mesin Anda.
Ini yang paling sederhana untuk PHP 7.0 atau yang lebih baru.
php -r '(function() {echo 'Hi';})();'
Artinya buat closure, lalu panggil fungsi dengan mengikuti "()". Bekerja seperti JS berkat urutan evaluasi variabel yang seragam.
Catatan, jawaban diterima baik-baik saja tetapi dibutuhkan 1,41x lebih lama (41% lebih lambat) daripada mendeklarasikan fungsi dan memanggilnya dalam dua baris.
[Saya tahu ini bukanlah jawaban yang benar-benar baru, tetapi saya merasa sangat berharga menambahkan ini di suatu tempat untuk pengunjung.]
Rincian:
<?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);
?>
Hasil:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Saya mencobanya dengan cara ini, tetapi ini lebih bertele-tele daripada jawaban teratas dengan menggunakan operator (atau fungsi) apa pun yang memungkinkan Anda untuk menentukan fungsi terlebih dahulu:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Ini bukan jawaban langsung, tapi solusi. Menggunakan PHP> = 7. Mendefinisikan kelas anonim dengan metode bernama dan membangun kelas dan memanggil metode itu segera.
$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 */})caranya?