创建一个类来存储回调函数,这种方法可以吗?


Creating a class to store callback functions, is this method okay?

我有一个函数,基本上,它执行以下操作:
启动变量 --> while循环 ->结果存储在数据库中。
但是,由于我项目的各个部分都使用此函数,因此我必须为每个步骤添加回调函数,以便给自己一些灵活性。

我当前的实现如下所示:

function doStuff(arg1, arg2, $callbacks = array())
{
    //Init vars
    $var1 = ...
    $var2 = ...
    $callbacks['onStart']();//callback..
    //Loop:
    while(....)
    {
       $callbacks['afterCycle']; //callback after each loop.
    }
    //Database storage.
    $this->store($data);
    $callbacks['onEnd'](); //callback...
    }  

但是我目前对这个函数的实现对我来说并不令人满意,我认为维护代码并不容易,如果我想创建另一个类似的函数(init->loop->storage(,我会重复自己,我的代码不会一致,例如,当前的后循环回调函数称为"afterCycle",但对于另一个函数, 它可以被称为"afterLoop",这将使我的代码不一致且更难理解。

我目前的想法是创建一个类,将这些回调函数存储在预定义的公共字段中,因此名称是不可更改的,此外,函数doStuff将强制传递该回调类的对象。我还不确定这个新的实现是否有任何好处,这就是我在这里问的原因。

我想到的新实现看起来像这样:

function doStuff(arg1, arg2, Callback $callbacks)
{
    //Init vars
    $var1 = ...
    $var2 = ...
    $callbacks->onStart();//callback..
    //Loop:
    while(....)
    {
       $callbacks->afterCycle(); //callback after each loop.
    }
    //Database storage.
    $this->store($data);
   $callbacks->onEnd(); //callback...
    }  

您可以使用接口

interface ICallBack {
    public function onStart();
    public function afterCycle();
    public function onEnd();
}
//So all the methods in ICallBack must be implemented within CallBack
class CallBack implements ICallBack {
    public function onStart() {
        //blah
    }       
    ...
}

function doStuff(arg1, arg2, ICallback $callback){
   //Init vars
   $var1 = ...
   $var2 = ...
   $callback->onStart();//callback..
   ....
}