2013-05-09 35 views
1

我有一個可以在CLI或web應用程序中使用的功能,也就是說,在這個過程中有一點區別;例如:如果我在CLI中使用此函數,它將使用文本進度條,但如果我將此函數用於Web應用程序,則這沒有意義。作爲參數傳遞多個回調函數的最佳方式?

該函數基本上是一個循環;所以我在尋找的是一種通過將代碼作爲參數進行傳遞以使其在每個循環結束時執行的方式來使此函數具有靈活性的方法。所以如果我在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. 
    } 
} 
相關問題