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

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

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

97
Emanuil Rusev 25 Авг 2010 в 20:58

9 ответов

Лучший ответ

Для PHP7: см. ответ Ясуо Охгаки: (function() {echo 'Hi';})();

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

call_user_func(function() { echo 'executed'; });
119
Community 23 Май 2017 в 12:25
(new ReflectionFunction(function() {
 // body function
}))->invoke();
6
innermond 5 Фев 2016 в 21:34

В 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
27
Wallace Maxters 16 Сен 2015 в 15:32

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

?>
15
Pacerier 2 Сен 2015 в 08:27

Это не прямой ответ, а обходной путь. Использование 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.
0
thecoolestname36 2 Янв 2019 в 11:21

Обратите внимание, что принятый ответ - это хорошо, но это занимает 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)
2
Shovas 29 Мар 2018 в 17:32

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

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

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

https://3v4l.org/06EL3

11
Yasuo Ohgaki 21 Окт 2016 в 03:40

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

    $value = $hack == ($hack = function(){
            // just a hack way of executing an anonymous function
            return array(0, 1, 2, 3);                
    }) ? $hack() : $hack();
0
Paul Jerome Bordallo 31 Мар 2015 в 18:31

Не выполняется сразу, но близко к;)

<?php

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

?>
-2
James 9 Дек 2014 в 18:47