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

时间:2013-06-11 21:56:56

标签: php function object callback

我有一个功能,基本上说,它具有以下功能:
启动变量 - > 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...

    }  

1 个答案:

答案 0 :(得分:1)

您可以使用interface

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

   ....
}