Optimization 将多个回调函数作为参数传递的最佳方式?

Optimization 将多个回调函数作为参数传递的最佳方式?,optimization,callback,php,Optimization,Callback,Php,我有一个可以在CLI或web应用程序中使用的功能,也就是说,过程中有一点不同;例如:如果我在CLI中使用此函数,它将使用文本进度条,但如果我在web应用程序中使用此函数,则没有意义 函数基本上是一个循环;所以我要寻找的是一种使这个函数灵活的方法,它可以将代码作为参数传递,以便在每个循环周期结束时执行。因此,如果我在CLI中使用此函数;我将传递一个进度增量函数来推进进度条,以此类推 我目前的解决方案是传递一个进度条对象实例,我认为这不是一个合适的解决方案;因为从长远来看,它似乎并不灵活 我已经在做

我有一个可以在CLI或web应用程序中使用的功能,也就是说,过程中有一点不同;例如:如果我在CLI中使用此函数,它将使用文本进度条,但如果我在web应用程序中使用此函数,则没有意义

函数基本上是一个循环;所以我要寻找的是一种使这个函数灵活的方法,它可以将代码作为参数传递,以便在每个循环周期结束时执行。因此,如果我在CLI中使用此函数;我将传递一个进度增量函数来推进进度条,以此类推

我目前的解决方案是传递一个进度条对象实例,我认为这不是一个合适的解决方案;因为从长远来看,它似乎并不灵活

我已经在做的一个演示示例:

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

        //finally...
        if(!empty($progressBar))
            $progressBar->advance();
    }
}  
因此,如果我想在循环末尾添加另一个函数,我必须将其作为参数传递,然后手动调用它;但正如我所说,这似乎并不正确


我正在考虑使用回调函数(一个匿名函数被传递给myFunction),但这样做的正确方式是什么;我应该把每个回调函数作为一个单独的参数吗?或者,为了使它更加灵活,我应该将所有回调函数分组到一个数组中(如果可能的话)。

是的,您可以为此使用回调

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. 
  }
}