В JavaScript вы можете определять анонимные функции, которые выполняются немедленно:
(function () { /* do something */ })()
Можете ли вы сделать что-то подобное в PHP?
В JavaScript вы можете определять анонимные функции, которые выполняются немедленно:
(function () { /* do something */ })()
Можете ли вы сделать что-то подобное в PHP?
Ответы:
Для PHP7: см . Ответ Ясуо Огаки :(function() {echo 'Hi';})();
Для предыдущих версий: единственный способ выполнить их немедленно, о чем я могу думать, - это
call_user_func(function() { echo 'executed'; });
call_user_func
В 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, благодаря единому порядку оценки переменных.
(new ReflectionFunction(function() {
// body function
}))->invoke();
Обратите внимание: принятый ответ - это нормально, но он занимает в 1,41 раза больше времени (на 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 */})
сделать?