2013-05-09 2 views
1

У меня есть функция, которая может быть использована в CLI или веб-приложении, поскольку, как говорится, есть небольшая разница в этом процессе; например: если я использую эту функцию для CLI, она будет использовать индикатор выполнения текста, но это не имеет смысла, если я использую эту функцию для веб-приложения.оптимальный способ передачи нескольких функций обратного вызова в качестве аргументов?

Функция в основном представляет собой петлю; поэтому я ищу способ сделать эту функцию гибкой, позволяя передавать код в качестве аргумента, чтобы он выполнялся в конце каждого цикла цикла. Поэтому, если я использую эту функцию в CLI; я передам инкрементную функцию прогресса для продвижения индикатора выполнения и т. д.

Мое текущее решение - передать экземпляр объекта состояния выполнения, который, я думаю, не является правильным решением; потому что в долгосрочной перспективе он не кажется гибким.

демонстрационный пример того, что я уже делаю:

function myFunction($progressBar = null) 
{ 
    for($i = 0; $i......) 
    { 
     //Do stuff 
     .... 

     //finally... 
     if(!empty($progressBar)) 
      $progressBar->advance(); 
    } 
} 

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

Я подумываю использовать функцию обратного вызова (анонимная функция передается myFunction). Но что это правильный способ сделать это; должен ли я сделать каждую функцию обратного вызова как отдельный аргумент? или, чтобы сделать его еще более гибким, следует ли группировать все функции обратного вызова в массиве (если это возможно).

ответ

0

Да, вы можете использовать обратные вызовы для этого.

function myFunction($progressBar = null, callable $callback = null) 
{ 
    for($i = 0; $i......) 
    { 
     //Do stuff 
     .... 

     //finally... 
     if(!empty($progressBar)) 
      $progressBar->advance(); 
    } 

    if ($callback){ //Execute the callback if it is passed as a parameter 
     $callback(); 
    } 
} 

Кроме того, вы можете задать параметры для анонимной функции:

Пример: вы хотите, чтобы повторить что-то в какой-то момент.

myFunction($progressBar) ; //No need yet 
myFunction($progressBar, function($result){ echo $result ; }) ; //Now you want to execute it 

Так, обрабатывать его соответствующим образом:

if ($callback){ //Execute the callback if it is passed as a parameter 
    $callback("All is fine"); //Execute the callback and pass a parameter 
} 

Массив обратных вызовов также могут быть полезны в этом случае, как:

$callbacks = array(
    "onStart" => function(){ echo "started" ; }, 
    "onEnd" => function(){ echo "ended" ; } 
) ; 

function myFunc($progressBar = null, $callbacks){ 
    if (isset($callbacks["onStart"]) && is_callable($callbacks["onStart"])){ 
    $callbacks["onStart"]() ;//Execute on start. 
    } 

    //Execute your code 

    if (isset($callbacks["onEnd"]) && is_callable($callbacks["onEnd"])){ 
    $callbacks["onEnd"]() ;//Execute on end. 
    } 
} 
Смежные вопросы