【问题标题】:Creating a class to store callback functions, is this method okay?创建一个类来存储回调函数,这个方法可以吗?
【发布时间】:2013-06-11 21:56:55
【问题描述】:

我有一个函数,基本上,它执行以下操作:
初始化变量 --> 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...

    }  

【问题讨论】:

  • 查看 SPL_Observable 接口或有关观察者模式和 Pub/Sub 的一般信息。
  • 我建议您在这里需要某种面向事件的架构,以实现解耦和灵活性。
  • 这个问题可能更适合codereview.stackexchange.com

标签: php function object callback


【解决方案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..

   ....
}

【讨论】:

    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2019-05-06
    • 2021-12-17
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多