In JavaScript, puoi definire funzioni anonime che vengono eseguite immediatamente:
(function () { /* do something */ })()
Puoi fare qualcosa del genere in PHP?
In JavaScript, puoi definire funzioni anonime che vengono eseguite immediatamente:
(function () { /* do something */ })()
Puoi fare qualcosa del genere in PHP?
Risposte:
Per PHP7: vedi la risposta di Yasuo Ohgaki :(function() {echo 'Hi';})();
Per le versioni precedenti: l'unico modo per eseguirle immediatamente mi viene in mente
call_user_func(function() { echo 'executed'; });
call_user_func
In PHP 7è fare lo stesso in javascript
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
L'output è:
1
2
3
Ovviamente puoi usare call_user_func, ma c'è ancora un'altra alternativa piuttosto semplice:
<?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";
});
?>
runtua funzione in qualche altra parte del codice perché non esiste un handle per la tua funzione esistente dopo la riga che la esegue immediatamente.
run()è eseguire immediatamente la funzione senza nome che gli è stata passata. Uguale a call_user_func(), solo nessun parametro viene passato.
$f();e potrebbe essere più veloce se il motore che usi non ottimizza per il caso speciale in cui call_user_funcha un solo argomento di funzione. Questo perché call_user_funcsupporta il passaggio di più parametri e il suo primo argomento supporta una stringa come argomento o una funzione. Detto questo, se call_user_funcè molto leggibile, non lo userei arun meno che il codice non si trovi da qualche parte nella parte inferiore della piramide .
rune call_user_func. call_user_funcha uno svantaggio intrinseco rispetto a runperché runfa solo una cosa, mentre call_user_funcsupporta funzionalità aggiuntive oltre a fare ciò che runfa. Puoi provare un rapido loop test ( ad esempio ) per vedere quale è più veloce sul tuo motore.
Questo è il più semplice per PHP 7.0 o versioni successive.
php -r '(function() {echo 'Hi';})();'
Significa creare chiusura, quindi chiamarla come funzione seguendo "()". Funziona proprio come JS grazie all'ordine di valutazione delle variabili uniforme.
Nota, la risposta accettata va bene, ma richiede 1,41 volte il tempo (41% più lento) rispetto alla dichiarazione di una funzione e alla sua chiamata su due righe.
[So che non è proprio una nuova risposta, ma ho ritenuto che fosse utile aggiungerla da qualche parte per i visitatori.]
Dettagli:
<?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);
?>
Risultati:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
L'ho provato in questo modo, ma è più prolisso della risposta principale utilizzando qualsiasi operatore (o funzione) che ti consenta di definire prima la funzione:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Questa non è una risposta diretta, ma una soluzione alternativa. Utilizzo di PHP> = 7. Definizione di una classe anonima con un metodo denominato, costruzione della classe e chiamata immediata del metodo.
$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 */})?