En JavaScript, puede definir funciones anónimas que se ejecutan inmediatamente:
(function () { /* do something */ })()
¿Puedes hacer algo así en PHP?
fuente
En JavaScript, puede definir funciones anónimas que se ejecutan inmediatamente:
(function () { /* do something */ })()
¿Puedes hacer algo así en PHP?
Para PHP7: vea la respuesta de Yasuo Ohgaki :(function() {echo 'Hi';})();
Para versiones anteriores: la única forma de ejecutarlas inmediatamente que se me ocurre es
call_user_func(function() { echo 'executed'; });
call_user_func
En PHP 7
es hacer lo mismo en javascript.
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
La salida es:
1
2
3
Bueno, por supuesto que puede usar call_user_func
, pero todavía hay otra alternativa bastante 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
a su función en alguna otra parte del código porque no existe un identificador para su función después de la línea que la ejecuta inmediatamente.
run()
es ejecutar inmediatamente la función sin nombre que se le ha pasado. Igual que call_user_func()
, solo que no se pasan parámetros.
$f();
y podría ser más rápido si el motor que usa no se optimiza para el caso especial donde call_user_func
solo tiene un argumento de función. Esto se debe a que call_user_func
admite el paso de múltiples parámetros y su primer argumento admite una cadena como argumento o una función. Dicho esto, si call_user_func
es mucho más legible, no lo usaría a run
menos que el código esté ubicado en algún lugar en la parte inferior de la pirámide .
run
y call_user_func
. call_user_func
tiene una desventaja inherente en comparación con run
porque run
solo hace una cosa, mientras que call_user_func
admite funciones adicionales además de hacer lo que run
hace. Puede probar una prueba de bucle rápido ( por ejemplo ) para ver cuál es más rápido en su motor.
Este es el más simple para PHP 7.0 o posterior.
php -r '(function() {echo 'Hi';})();'
Significa crear cierre, luego llamarlo como función siguiendo "()". Funciona igual que JS gracias al orden uniforme de evaluación de variables.
(new ReflectionFunction(function() {
// body function
}))->invoke();
Tenga en cuenta que la respuesta aceptada está bien, pero tarda 1,41 veces más (41% más lento) que declarar una función y llamarla en dos líneas.
[Sé que no es una respuesta nueva, pero sentí que era valioso agregar esto en algún lugar para los visitantes].
Detalles:
<?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);
?>
Resultados:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Lo probé de esta manera, pero es más detallado que la respuesta principal al usar cualquier operador (o función) que le permita definir la función primero:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
$hack = function(){...}; $hack()
?
Esta no es una respuesta directa, sino una solución. Usando PHP> = 7. Definir una clase anónima con un método con nombre y construir la clase y llamar al método de inmediato.
$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.
No se ejecuta de inmediato, pero cerca de;)
<?php
$var = (function(){ echo 'do something'; });
$var();
?>
call_user_func(function(){/* stuff */})
hago?