关于oop:类似php中的回调委托函数

关于oop:类似php中的回调委托函数

Something like a callback delegate function in php

我想实现类似于PHP中的c#委托方法的东西。 一个简短的词可以解释我总体上想做的事情:我正在尝试实现一些异步功能。 基本上,一些资源密集型调用会在基础系统运行时排队,缓存和调度。 当异步调用最终收到响应时,我希望引发一个回调事件。

我在想出一种在PHP中执行回调的机制时遇到了一些问题。 我想出了一种目前可以使用的方法,但是我对此并不满意。 基本上,它涉及传递对对象的引用以及对象上的方法名称,该对象将用作回调(将响应作为参数),然后在需要时使用eval调用方法。 由于种种原因,这是次优的选择,有没有人知道的更好的方法?


(除了观察者模式之外),您还可以使用call_user_func()call_user_func_array()

如果将array(obj, methodname)作为第一个参数传递,它将作为$obj->methodname()调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Foo {
    public function bar($x) {
        echo $x;
    }
}

function xyz($cb) {
    $value = rand(1,100);
    call_user_func($cb, $value);
}

$foo = new Foo;
xyz( array($foo, 'bar') );
?>

您对使用观察者模式有何看法? 如果没有,则可以通过以下方式实现真正的回调:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// This function uses a callback function.
function doIt($callback)
{
    $data ="this is my data";
    $callback($data);
}


// This is a sample callback function for doIt().
function myCallback($data)
{
    print 'Data is: ' .  $data . "
"
;
}


// Call doIt() and pass our sample callback function's name.
doIt('myCallback');

显示:数据是:这是我的数据


我想知道我们是否可以使用__invoke magic方法创建"种类"一流的函数,从而实现回调

对于PHP 5.3听起来很像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
interface Callback
{
    public function __invoke();
}

class MyCallback implements Callback
{
    private function sayHello () { echo"Hello"; }
    public function __invoke ()  { $this->sayHello(); }
}

class MySecondCallback implements Callback
{
    private function sayThere () { echo"World"; }
    public function __invoke ()  { $this->sayThere(); }
}

class WhatToPrint
{
    protected $callbacks = array();
    public function register (Callback $callback)
    {
        $this->callbacks[] = $callback;
        return $this;
    }
    public function saySomething ()
    {
        foreach ($this->callbacks as $callback) $callback();
    }
}

$first_callback = new MyCallback;
$second_callback = new MySecondCallback;
$wrapper = new WhatToPrint;
$wrapper->register($first_callback)->register($second_callback)->saySomething();

将打印HelloWorld

希望它会有所帮助;)

但是我更喜欢带有SPL的Controller模式来实现这一功能。


推荐阅读