web-dev-qa-db-fra.com

Comment puis-je exécuter immédiatement une fonction anonyme en PHP?

En JavaScript, vous pouvez définir des fonctions anonymes exécutées immédiatement:

(function () { /* do something */ })()

Pouvez-vous faire quelque chose comme ça en PHP?

90
Emanuil Rusev

Pour PHP7: voir Réponse de Yasuo Ohgaki : (function() {echo 'Hi';})();

Pour les versions précédentes: le seul moyen de les exécuter immédiatement est la suivante:

call_user_func(function() { echo 'executed'; });
111
Gordon

Dans PHP 7 c'est pareil en javascript

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

La sortie est:

1
2
3
22
Wallace Maxters

Bien sûr, vous pouvez utiliser call_user_func , mais il existe une autre alternative assez simple:

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

?>
15
Pacerier

C'est le plus simple pour PHP 7.0 ou version ultérieure.

php -r '(function() {echo 'Hi';})();'

Cela signifie créer une fermeture, puis appeler comme fonction en suivant "()". Fonctionne comme JS grâce à un ordre d'évaluation variable uniforme.

https://3v4l.org/06EL3

8
Yasuo Ohgaki
(new ReflectionFunction(function() {
 // body function
}))->invoke();
6
innermond

Remarque, réponse acceptée est correct, mais cela prend 1,41 fois plus longtemps (41% plus lentement) que de déclarer une fonction et de l'appeler sur deux lignes.

[Je sais que ce n'est pas vraiment une nouvelle réponse, mais j'estimais qu'il était utile d'ajouter ceci quelque part pour les visiteurs.]

Détails:

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

Résultats:

$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
1
Shovas

Je l'ai essayé de cette façon, mais c'est plus verbeux que la réponse principale en utilisant n'importe quel opérateur (ou fonction) permettant de définir la fonction en premier:

    $value = $hack == ($hack = function(){
            // just a hack way of executing an anonymous function
            return array(0, 1, 2, 3);                
    }) ? $hack() : $hack();
0

Ce n'est pas une réponse directe, mais une solution de contournement. Using PHP> = 7. Définir une classe anonyme avec une méthode nommée, construire la classe et appeler immédiatement la méthode.

$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.
0
thecoolestname36