我想在PHP中实现类似于c#delegate方法的东西。快速解释我正在尝试做的事情:我正在尝试实现一些异步功能。基本上,一些资源密集型调用在底层系统到达时会被排队,缓存和调度。当异步调用最终收到响应时,我希望引发一个回调事件。
我遇到了一些问题,想出一种在PHP中进行回调的机制。我想出了一种现在适用的方法,但我对它不满意。基本上,它涉及传递对象的引用和方法的名称,它将作为回调(将响应作为参数),然后在需要时使用eval调用方法。由于各种原因,这是次优的,有没有人知道更好的方法呢?
答案 0 :(得分:16)
(除观察者模式外)您还可以使用call_user_func()
或call_user_func_array()
。
如果您将array(obj, methodname)
作为第一个参数传递,则会将其作为$obj->methodname()
调用。
<?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 :(得分:4)
您对使用Observer模式有何看法?如果没有,您可以通过这种方式实现真正的回调:
// 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 . "\n";
}
// Call doIt() and pass our sample callback function's name.
doIt('myCallback');
显示:数据是:这是我的数据
答案 2 :(得分:3)
我想知道我们是否可以使用__invoke魔术方法创建“种类”的第一类函数,从而实现回调
对于PHP 5.3,听起来像这样的东西
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模式来实现这样的功能。