У JavaScript ви можете визначити анонімні функції, які виконуються негайно:
(function () { /* do something */ })()
Чи можете ви зробити щось подібне в PHP?
У JavaScript ви можете визначити анонімні функції, які виконуються негайно:
(function () { /* do something */ })()
Чи можете ви зробити щось подібне в PHP?
Відповіді:
Щодо PHP7: див. Відповідь Ясуо Огакі :(function() {echo 'Hi';})();
Для попередніх версій: єдиний спосіб їх негайного виконання - я можу придумати
call_user_func(function() { echo 'executed'; });
call_user_func
In PHP 7
- зробити те саме в javascript
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Вихід:
1
2
3
Ну звичайно, ви можете використовувати call_user_func
, але є ще одна досить проста альтернатива:
<?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
вашу функцію в якійсь іншій частині коду, оскільки після рядка, який негайно її виконує, не існує дескриптора вашої функції.
run()
полягає у негайному виконанні неназваної функції, переданої йому. Так само call_user_func()
, як тільки параметри не передаються.
$f();
і може бути швидшим, якщо движок, який ти використовуєш, не оптимізує для особливого випадку, де call_user_func
є лише один аргумент функції. Це тому, що call_user_func
підтримує передачу декількох параметрів, і це перший аргумент підтримує або рядок як аргумент, або функцію. Тим не менш, якщо call_user_func
це читається набагато, я б не використовував, run
якщо код не знаходиться десь внизу піраміди .
run
та call_user_func
. call_user_func
має невід'ємний недолік у порівнянні з run
тим, що run
робить лише одне, тоді як call_user_func
підтримує додаткові функції на додаток до того, що run
робить. Ви можете спробувати швидкий тест циклу ( наприклад ), щоб побачити, що швидше на вашому двигуні.
Це найпростіший варіант для PHP 7.0 або новішої версії.
php -r '(function() {echo 'Hi';})();'
Це означає створити закриття, а потім викликати його як функцію, дотримуючись "()". Працює так само, як JS, завдяки єдиному порядку оцінки змінних.
Примітка, прийнята відповідь - це добре, але це займає 1,41x довше (на 41% повільніше), ніж оголошення функції та виклик її у два рядки.
[Я знаю, що це насправді не нова відповідь, але я відчув, що було цінним додати це десь для відвідувачів.]
Деталі:
<?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);
?>
Результати:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
Я спробував це таким чином, але це більш багатослівно, ніж відповідь у верхній частині, використовуючи будь-який оператор (або функцію), який дозволяє визначити функцію спочатку:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
Це не пряма відповідь, а обхідний шлях. Використання PHP> = 7. Визначення анонімного класу за допомогою названого методу та побудова класу та негайний виклик методу.
$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 */})
зробити?