【问题标题】:optimal way of passing multiple callback functions as arguments?将多个回调函数作为参数传递的最佳方式?
【发布时间】:2013-05-09 15:22:48
【问题描述】:

我有一个可以在 CLI 或 web 应用程序中使用的函数,也就是说,过程中存在一些差异;例如:如果我将此函数用于 CLI,它将使用文本进度条,但如果我将此函数用于 Web 应用程序,则没有意义。

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

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

我已经在做的演示示例:

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

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

所以,如果我想在循环结束时添加另一个函数,我必须将它作为参数传递并稍后手动调用它;但正如我所说,这似乎并不正确。

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

【问题讨论】:

    标签: optimization callback php


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多