En JavaScript, vous pouvez définir des fonctions anonymes qui sont exécutées immédiatement:
(function () { /* do something */ })()
Pouvez-vous faire quelque chose comme ça en PHP?
En JavaScript, vous pouvez définir des fonctions anonymes qui sont exécutées immédiatement:
(function () { /* do something */ })()
Pouvez-vous faire quelque chose comme ça en PHP?
Réponses:
Pour PHP7: voir la réponse de Yasuo Ohgaki :(function() {echo 'Hi';})();
Pour les versions précédentes: la seule façon de les exécuter immédiatement à laquelle je pense est
call_user_func(function() { echo 'executed'; });
call_user_func
C'est PHP 7
de faire de même 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
Bien sûr, vous pouvez utiliser call_user_func
, mais il existe encore 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";
});
?>
run
votre fonction dans une autre partie du code car il n'y a pas de descripteur de votre fonction existant après la ligne qui l'exécute immédiatement.
run()
est d'exécuter immédiatement la fonction sans nom qui lui est passée. Identique à call_user_func()
, aucun paramètre n'est transmis.
$f();
et pourrait être plus rapide si le moteur que vous utilisez n'optimise pas pour le cas particulier où call_user_func
il n'y a qu'un seul argument de fonction. C'est parce que call_user_func
prend en charge le passage de plusieurs paramètres et que son premier argument prend en charge une chaîne en tant qu'argument ou une fonction. Cela dit, si call_user_func
c'est beaucoup plus lisible, je ne l'utiliserais run
que si le code est situé quelque part au bas de la pyramide .
run
et call_user_func
. call_user_func
a un inconvénient inhérent par rapport à run
car run
ne fait qu'une chose, alors que call_user_func
prend en charge des fonctionnalités supplémentaires en plus de faire ce que run
fait. Vous pouvez essayer un test de boucle rapide ( par exemple ) pour voir lequel est le plus rapide sur votre moteur.
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 l'appeler comme fonction en suivant "()". Fonctionne comme JS grâce à un ordre d'évaluation des variables uniforme.
Notez que la réponse acceptée est correcte mais cela prend 1,41x plus longtemps (41% plus lent) 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'ai pensé qu'il était utile de l'ajouter 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)
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) qui vous permet 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();
Ce n'est pas une réponse directe, mais une solution de contournement. Utilisation de PHP> = 7. Définition d'une classe anonyme avec une méthode nommée et construction de la classe et appel immédiat de 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.
call_user_func(function(){/* stuff */})
faire?