1

CLIまたはWebアプリケーションで使用できる機能がありますが、プロセスに少し違いがあります。たとえば、この関数を CLI に使用している場合、テキスト プログレス バーが使用されますが、この関数を Web アプリケーションに使用している場合は意味がありません。

関数は基本的にループです。私が探しているのは、コードを引数として渡して各ループサイクルの最後に実行できるようにすることで、この関数を柔軟にする方法です。したがって、CLI でこの関数を使用している場合。プログレス バーを進めるためのプログレス インクリメンタル関数を渡します。

私の現在の解決策は、プログレス バー オブジェクトのインスタンスを渡すことですが、これは適切な解決策ではないと思います。長期的には柔軟性がないように見えるからです。

私がすでに行っていることのデモ例:

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

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

そのため、ループの最後に別の関数を追加したい場合は、それを引数として渡し、後で手動で呼び出す必要があります。しかし、私が言ったように、それは正しくないようです。

コールバック関数 (myFunction に渡される匿名関数) を使用することを考えていますが、それを行う適切な方法は何ですか? 各コールバック関数を個別の引数として作成する必要がありますか? または、さらに柔軟にするために、すべてのコールバック関数を配列にグループ化する必要があります(可能な場合)。

4

1 に答える 1

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. 
  }
}
于 2013-05-09T15:29:05.467 に答える