类似于php中的回调委托函数
我想在PHP中实现类似于c#委托方法的东西。一个简短的词来解释我试图做什么:我试图实现一些异步功能。基本上,一些资源密集型调用在底层系统访问时排队、缓存和调度。当异步调用最终收到响应时,我希望引发回调事件类似于php中的回调委托函数,php,oop,Php,Oop,我想在PHP中实现类似于c#委托方法的东西。一个简短的词来解释我试图做什么:我试图实现一些异步功能。基本上,一些资源密集型调用在底层系统访问时排队、缓存和调度。当异步调用最终收到响应时,我希望引发回调事件 我在用PHP进行回调时遇到了一些问题。我想出了一个暂时有效的方法,但我不满意。基本上,它涉及传递对对象的引用以及对象上用作回调的方法的名称(将响应作为参数),然后在需要时使用eval调用该方法。由于各种原因,这是次优的,有没有其他人知道的更好的方法 您对使用该模式感觉如何?如果不是,则可以通过
我在用PHP进行回调时遇到了一些问题。我想出了一个暂时有效的方法,但我不满意。基本上,它涉及传递对对象的引用以及对象上用作回调的方法的名称(将响应作为参数),然后在需要时使用eval调用该方法。由于各种原因,这是次优的,有没有其他人知道的更好的方法 您对使用该模式感觉如何?如果不是,则可以通过以下方式实现真正的回调:
// 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');
显示:数据是:这是我的数据(除了观察者模式),您也可以使用或
如果将数组(obj,methodname)
作为第一个参数传递,它将作为$obj->methodname()
调用
我想知道我们是否可以使用u invoke magic方法来创建“类”的第一类函数,从而实现回调 对于PHP5.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的控制器模式。如果这是一个愚蠢的问题,请原谅,但是在这种情况下使用回调原则有什么好处?调用doIt()也是一样的;myCallback();功能一个接一个?我明白了在AJAX中回调的意义,或者在Objective C中的委托模式,或者任何异步情况下,但我不明白?@luigi7up您可以使用它在$data中循环,并为for循环中$data中的每个项调用回调函数。这是在asp中设置ondatabound回调时中继器的工作方式
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();