Возвращаемое значение анонимной функции

Обновление. Начиная с PHP7, теперь можно использовать анонимную функцию разыменования с помощью синтаксиса:

$array[] = [
    'new' => (function()
    {
        ...
        return mt_rand();
    })(),

    'or' => getClosure()()
]

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

Допустим, у меня был цикл for, который сделал массив, в котором каждое значение массива должно было иметь вызов базы данных, что я хотел бы сделать:

for($i = 0; $i != 10; $i++)
{
    $array[] = [
        'new' => function(){
            // some proccesing here maybe
            // lets use mt_rand for this example.
            return mt_rand();
        },

        'old' => function(){
            return mt_rand();
        }
    ];
}

или, может быть

echo function(){
     // again, we'll just use mt_rand
     return mt_rand();
};

Они оба возвращают класс closure. Нужно ли вообще передавать возвращаемое им значение обратно в массив или эхо для приведенных выше примеров?

Обновление: я установил, что это невозможно, поэтому запрос функции можно найти здесь: http://bugs.php.net/bug.php?id=64608

Ответ 1

Простейшее обходное решение на сегодняшний день:

echo call_user_func(function () { return 'foo'; });

Ответ 2

Попробуйте назначить анонимную function переменной.

$myFunc = function() {
  return 'Test';
}

echo $myFunc(); // Outputs Test

Значение самой функции не является возвращаемым значением. Возвращаемое значение - это значение, возвращаемое функцией при called функции.

Редактировать:

Как было предложено путем deceze, вы можете использовать call_user_func(). Другой способ добиться того, что вы хотите, - использовать php eval(), что отнюдь не является хорошей практикой кодирования.

$array[] = array(
  'new' => call_user_func(function() {
     // some proccesing here maybe
     // lets use mt_rand for this example.
     return mt_rand();
  }),
  'old' => call_user_func(function() {
    return mt_rand();
  }),
);

eval()

echo eval('$x = function() {
  // some proccesing here maybe
  // lets use mt_rand for this example.
  return mt_rand();
}; return $x();');

Ответ 3

Закрытие, похоже, должно быть назначено, прежде чем его можно будет отменить - попробуйте этот код ниже:

for($i = 0; $i != 10; $i++)
{
    $array[] = [
    'new' => call_user_func(function(){
        // some proccesing here maybe
        // lets use mt_rand for this example.
        return mt_rand();
    }),

    'old' => call_user_func(function(){
        return mt_rand();
    })
    ];
}

[edit] - Изменено для использования call_user_func() вместо пользовательской функции - doh!

Ответ 4

Вы должны назначить функцию var, посмотрите здесь

Эта работа

    for($i = 0; $i != 10; $i++)
 {
$array[] = [
    'new' => function(){
        // some proccesing here maybe
        // lets use mt_rand for this example.
        return mt_rand();
    },

    'old' => function(){
        return mt_rand();
    }
];
}
echo $array[5]['new']();

или

$function = function(){
 // again, we'll just use mt_rand
 return mt_rand();
};

echo $function();