Как мне сразу выполнить анонимную функцию в PHP?
в JavaScript можно определить анонимные функции, которые выполняются немедленно:
(function () { /* do something */ })()
можете ли вы сделать что-то подобное в PHP?
8 ответов:
для PHP7: см. ответ Ясуо Огаки:
(function() {echo 'Hi';})();
для предыдущих версий: единственный способ выполнить их немедленно я могу думать о
call_user_func(function() { echo 'executed'; });
на
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"; }); ?>
Это самый простой для PHP 7.0 или более поздней версии.
php -r '(function() {echo 'Hi';})();'
это означает создать закрытие, а затем вызвать его как функцию, следуя "()". Работает так же, как JS благодаря равномерному переменному порядку оценки.
Примечание принято отвечать это нормально, но это занимает 1,41 x так долго (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();