W JavaScript możesz zdefiniować anonimowe funkcje, które są wykonywane natychmiast:
(function () { /* do something */ })()
Czy możesz zrobić coś takiego w PHP?
W JavaScript możesz zdefiniować anonimowe funkcje, które są wykonywane natychmiast:
(function () { /* do something */ })()
Czy możesz zrobić coś takiego w PHP?
Odpowiedzi:
W przypadku PHP7: zobacz odpowiedź Yasuo Ohgaki :(function() {echo 'Hi';})();
W przypadku poprzednich wersji: jedynym sposobem na ich natychmiastowe wykonanie jest
call_user_func(function() { echo 'executed'; });
call_user_func
W PHP 7ma zrobić to samo w javascript
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Wynik to:
1
2
3
Oczywiście możesz użyć call_user_func, ale jest jeszcze jedna całkiem prosta alternatywa:
<?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";
});
?>
runtwojej funkcji w innej części kodu, ponieważ nie ma uchwytu do twojej funkcji istniejącego po linii, która natychmiast ją wykonuje.
run()jest natychmiastowe wykonanie przekazanej mu nienazwanej funkcji. To samo co call_user_func(), tylko żadne parametry nie są przekazywane.
$f();i może być szybszy, jeśli używany silnik nie optymalizuje się dla specjalnego przypadku, w którym call_user_funcma tylko jeden argument funkcji. Dzieje się tak, ponieważ call_user_funcobsługuje przekazywanie wielu parametrów, a jego pierwszy argument obsługuje ciąg jako argument lub funkcję. To powiedziawszy, jeśli call_user_funcjest dużo czytelny, nie użyłbym,run chyba że kod znajduje się gdzieś na dole piramidy .
runi call_user_func. call_user_funcma nieodłączną wadę w porównaniu z tym, runże runrobi tylko jedną rzecz, podczas gdy call_user_funcobsługuje dodatkowe funkcje oprócz robienia tego, co runrobi. Możesz wypróbować szybki test pętli ( np. ), Aby sprawdzić, który jest szybszy w Twoim silniku.
To jest najprostsze dla PHP 7.0 lub nowszego.
php -r '(function() {echo 'Hi';})();'
Oznacza to utworzenie domknięcia, a następnie wywołanie go jako funkcji, podążając za „()”. Działa podobnie jak JS dzięki jednolitej kolejności oceny zmiennych.
Zauważ, że zaakceptowana odpowiedź jest w porządku, ale zajmuje 1,41 razy dłużej (41% wolniej) niż zadeklarowanie funkcji i wywołanie jej w dwóch wierszach.
[Wiem, że to naprawdę nie jest nowa odpowiedź, ale uznałem, że warto dodać ją gdzieś dla gości.]
Detale:
<?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);
?>
Wyniki:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Wypróbowałem to w ten sposób, ale jest to bardziej szczegółowe niż najlepsza odpowiedź, używając dowolnego operatora (lub funkcji), który pozwala najpierw zdefiniować funkcję:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
To nie jest bezpośrednia odpowiedź, ale obejście. Korzystanie z PHP> = 7. Definiowanie anonimowej klasy za pomocą nazwanej metody i konstruowanie klasy oraz natychmiastowe wywołanie metody.
$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 */})zrobić?