2010-08-25 2 views
86

В JavaScript, вы можете определить анонимные функции, которые выполняются немедленно:Как немедленно выполнить анонимную функцию в PHP?

(function() { /* do something */ })() 

Можете ли вы сделать что-то подобное в PHP?

+2

Я не PHP 5.3 на моих руках, чтобы попробовать, но как 'call_user_func (функция() {/ * прочее * /})' делать? – Jasper

ответ

105

Для PHP7: см Yasuo Ohgaki's answer: (function() {echo 'Hi';})();

Для предыдущих версий: единственный способ выполнить их сразу, я могу думать о

call_user_func(function() { echo 'executed'; }); 
+12

Если не было (или, пока) [функция вызова цепочки] (http://wiki.php.net/rfc/fcallfcall), это будет моим предложением. – salathe

+2

@Gordon: php 5.4 все еще ничего? – dynamic

+0

@ да123 нет. все еще нужно использовать 'call_user_func' – Gordon

14

Ну, конечно, вы можете использовать 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"; 
}); 

?> 
+1

Я хочу сразу же выполнить функцию, потому что функция, которую я определяю, является той, которая НЕ ДОЛЖНА быть вызвана более одного раза при нормальном выполнении.Проблема с определением именованной функции run(), как и у вас, заключается в том, что любой, кто видит код, может подумать, что они могут вызвать run() тоже в некоторой другой части кода. Функция немедленного выполнения дает понять, что этот код не должен запускаться дважды. –

+3

Они не могут вызывать 'run' в вашей функции в какой-либо другой части кода, потому что нет дескриптора вашей функции, существующей после строки, которая немедленно ее выполняет. – Pacerier

+0

Он означает, что он не хочет, чтобы кто-либо еще вызывал функцию, например, запускал любую другую функцию. –

-1

Не выполнено inmediately, но близко к;)

<?php 

$var = (function(){ echo 'do something'; }); 
$var(); 

?> 
0

Я попробовал этот путь, но это более многословен, чем топ-ответ с помощью любого оператора (или функции), которая позволяет определить функцию первого:

$value = $hack == ($hack = function(){ 
      // just a hack way of executing an anonymous function 
      return array(0, 1, 2, 3);     
    }) ? $hack() : $hack(); 
+0

Тогда почему бы не просто '$ hack = function() {...}; $ Взломать() '? – Soaku

19

В 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 
5
(new ReflectionFunction(function() { 
// body function 
}))->invoke(); 
+4

Вы можете предоставить более подробную информацию? возможно, добавить объяснение? – DeveloperACE

7

Это самый простой для PHP 7.0 или новее.

php -r '(function() {echo 'Hi';})();' 

Это значит создать закрытие, а затем вызвать его как функцию, следуя «()». Работает точно так же, как JS благодаря единому порядку оценки переменной.

https://3v4l.org/06EL3

Смежные вопросы