2016-03-15 3 views
4

У меня есть класс с обратным вызовом. Я передаю строку классу, и обратный вызов вызывается с этой строкой в ​​качестве функции обратного вызова. Он работает немного как это:PHP: Как добавить переменную в имя функции?

$obj->runafter('do_this'); 

function do_this($args) { 
    echo 'done'; 
} 

То, что я ищу, чтобы сделать, это запустить эту внутреннюю петлю и так, что функция не записывается в несколько раз, я хочу, чтобы добавить переменную с именем функции. Что я хочу сделать, это примерно так:

for($i=0;$i<=3;$i++) : 
    $obj->runafter('do_this_' . $i); 

    function do_this_{$i}($args) { 
     echo 'done'; 
    } 
endfor; 

Любые идеи о том, как я могу это сделать в PHP?

ответ

6

Я бы передать функции непосредственно в качестве крышки:

for($i=0; $i<=3; $i++) { 
    $obj->runafter(function($args) use($i) { 
     echo "$i is done"; 
    }); 
} 

Обратите внимание, как вы можете use($i) сделать это локальная переменная доступна в вашем обратного вызова, если это необходимо.

Вот рабочий пример: https://3v4l.org/QV66p

Более подробную информацию о вызываемых объектов и закрытий:

http://php.net/manual/en/language.types.callable.php

+0

Оценка, это на самом деле безумие x) Хороший! – KDOT

+1

@ KyleE4K просто обновлен ссылкой на рабочий пример. – jszobody

+0

Интересно, возможно ли это с помощью C# (более строго типизированные языки) - время исследования haha ​​ – KDOT

0

По вашему вопросу, вы должны определить свою функцию перед циклом. Тогда вам не нужно беспокоиться о том, что он переопределяется на каждой итерации цикла.

function do_this($args) { 
    echo 'done'; 
} 

for($i=0;$i<=3;$i++) : 
    $obj->runafter('do_this'); 
endfor; 
2

Вы можете назначить функцию переменной и создать замыкание также вы можете передать переменную вне сферы анонимной функции с помощью использования ключевого слова

$callback = function($args) use($i) { 
    echo "$i is done"; 
}; 

for ($i = 0; $i <= 3; $i++) { 
    $arg = "some argument"; 
    $obj->runafter($callback($arg)); 
} 

Полезные ссылки:

+0

Упрощен для отображения того, как вы можете сначала определить функцию как закрытие. Обратите внимание, что в конце определения функции вам нужна точка с запятой, и вы получите 'Notice: неопределенная переменная: i'. Если уведомления включены. – jszobody

+0

Хорошая точка благодаря @jszobody – Robert

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