Em JavaScript, você pode definir funções anônimas que são executadas imediatamente:
(function () { /* do something */ })()
Você pode fazer algo assim em PHP?
Em JavaScript, você pode definir funções anônimas que são executadas imediatamente:
(function () { /* do something */ })()
Você pode fazer algo assim em PHP?
Respostas:
Para PHP7: veja a resposta de Yasuo Ohgaki :(function() {echo 'Hi';})();
Para versões anteriores: a única maneira de executá-los imediatamente que consigo pensar é
call_user_func(function() { echo 'executed'; });
call_user_func
Em PHP 7
é fazer o mesmo em javascript
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
O resultado é:
1
2
3
Bem, é claro que você pode usar call_user_func
, mas ainda há outra alternativa bem simples:
<?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
sua função em alguma outra parte do código porque não há nenhum identificador para sua função existente após a linha que a executa imediatamente.
run()
é executar imediatamente a função não nomeada transmitida a ele. O mesmo que call_user_func()
, apenas nenhum parâmetro é passado.
$f();
e pode ser mais rápido se o mecanismo que você usa não otimiza para o caso especial em que call_user_func
tem apenas um argumento de função. Isso ocorre porque call_user_func
suporta a passagem de vários parâmetros e seu primeiro argumento suporta uma string como um argumento ou uma função. Dito isso, se call_user_func
for muito legível, eu não usaria run
, a menos que o código estivesse localizado em algum lugar na parte inferior da pirâmide .
run
e call_user_func
. call_user_func
tem uma desvantagem inerente quando comparado a run
porque run
faz apenas uma coisa, enquanto call_user_func
oferece suporte a recursos adicionais, além de fazer o que run
faz. Você pode tentar um teste de loop rápido ( por exemplo ) para ver qual é mais rápido em seu motor.
Este é o mais simples para PHP 7.0 ou posterior.
php -r '(function() {echo 'Hi';})();'
Significa criar um encerramento e, em seguida, chamá-lo como função seguindo "()". Funciona como JS graças à ordem de avaliação de variável uniforme.
Observação: uma resposta aceita está bem, mas leva 1,41x mais tempo (41% mais lento) do que declarar uma função e chamá-la em duas linhas.
[Sei que não é realmente uma resposta nova, mas achei valioso adicioná-la em algum lugar para os visitantes.]
Detalhes:
<?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)
Tentei desta forma, mas é mais prolixo do que a resposta principal, usando qualquer operador (ou função) que permite definir a função primeiro:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Esta não é uma resposta direta, mas uma solução alternativa. Usando PHP> = 7. Definindo uma classe anônima com um método nomeado e construindo a classe e chamando o método imediatamente.
$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 */})
faço?