类似于php中的回调委托函数
时间:2020-03-05 18:49:01 来源:igfitidea点击:
我想在PHP中实现类似于cdelegate方法。一个简短的词可以解释我总体上想做的事情:我正在尝试实现一些异步功能。基本上,一些资源密集型调用会在基础系统运行时排队,缓存和调度。当异步调用最终收到响应时,我希望引发一个回调事件。
我在想出一种在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');
显示:数据是:这是我的数据
回答
(除了观察者模式之外),我们还可以使用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') ); ?>
回答
我想知道我们是否可以使用__invoke magic方法创建"种类"一流的函数,从而实现回调
对于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模式来实现这一功能。