In JavaScript können Sie anonyme Funktionen definieren, die sofort ausgeführt werden:
(function () { /* do something */ })()
Können Sie so etwas in PHP machen?
In JavaScript können Sie anonyme Funktionen definieren, die sofort ausgeführt werden:
(function () { /* do something */ })()
Können Sie so etwas in PHP machen?
Antworten:
Für PHP7: siehe Yasuo Ohgakis Antwort :(function() {echo 'Hi';})();
Für frühere Versionen: Die einzige Möglichkeit, sie sofort auszuführen, ist die, an die ich denken kann
call_user_func(function() { echo 'executed'; });
call_user_func
In PHP 7
ist das gleiche in Javascript zu tun
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Die Ausgabe ist:
1
2
3
Natürlich können Sie verwenden call_user_func
, aber es gibt noch eine andere ziemlich einfache Alternative:
<?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
Ihre Funktion in einem anderen Teil des Codes nicht aufrufen, da nach der Zeile, die sie sofort ausführt, kein Handle für Ihre Funktion vorhanden ist.
run()
besteht darin, die an ihn übergebene unbenannte Funktion sofort auszuführen. Es call_user_func()
werden nur keine Parameter übergeben.
$f();
und ist möglicherweise schneller, wenn die von Ihnen verwendete Engine nicht für den Sonderfall optimiert wird, in dem call_user_func
nur ein Funktionsargument vorhanden ist. Dies liegt daran, dass call_user_func
die Übergabe mehrerer Parameter unterstützt wird und das erste Argument entweder eine Zeichenfolge als Argument oder eine Funktion unterstützt. Das heißt, wenn call_user_func
es gut lesbar ist, würde ich es nur verwenden, run
wenn sich der Code irgendwo unten in der Pyramide befindet .
run
und call_user_func
. call_user_func
hat einen inhärenten Nachteil im Vergleich zu run
weil run
nur eine Sache tut, während call_user_func
zusätzliche Funktionen zusätzlich zu dem, was run
tut, unterstützt. Sie können einen schnellen Schleifentest ( z. B. ) durchführen, um festzustellen, welcher Motor schneller ist.
Dies ist die einfachste Version für PHP 7.0 oder höher.
php -r '(function() {echo 'Hi';})();'
Es bedeutet, einen Abschluss zu erstellen und ihn dann als Funktion aufzurufen, indem Sie "()" folgen. Funktioniert genau wie JS dank einheitlicher variabler Auswertungsreihenfolge.
Hinweis, akzeptierte Antwort in Ordnung ist, aber 1,41x so lange dauert (41% langsamer) als das Deklarieren einer Funktion und das Aufrufen in zwei Zeilen.
[Ich weiß, dass es keine wirklich neue Antwort ist, aber ich fand es wertvoll, diese irgendwo für Besucher hinzuzufügen.]
Einzelheiten:
<?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);
?>
Ergebnisse:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Ich habe es auf diese Weise ausprobiert, aber es ist ausführlicher als die oberste Antwort, wenn Sie einen Operator (oder eine Funktion) verwenden, mit dem Sie die Funktion zuerst definieren können:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Dies ist keine direkte Antwort, sondern eine Problemumgehung. Verwenden von PHP> = 7. Definieren einer anonymen Klasse mit einer benannten Methode, Erstellen der Klasse und sofortiges Aufrufen der Methode.
$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 */})
das?