有没有办法将其他参数传递给回调函数?
class Bar{
public function test(){
$count = 0;
$foo = new Class();
$foo->calling([$this, 'barFunction']);
}
public function barFunction($data, $count){
//...
}
我希望Foo的调用方法传入数据并将$ count作为第二个参数传递。
这是一个闭包而不是参数的例子。如果我使用闭包我可以传入$ count但在这种情况下我需要使用Bar的类函数。
class Bar{
public function test(){
$count = 0;
$foo = new Class();
$foo->calling(function($data) use($count){
//..some work
});
}
答案 0 :(得分:3)
call_user_func_array([$context, $function], $params);
即。在您的示例中,$context
为Bar($this
),$function
为'barFunction'
,params为[$data, $count]
。
喜欢这个吗?
<?php
class Foo {
public function __construct() {}
public function mDo($callback) {
$count = 10;
$data = ['a', 'b'];
// do a lot of work (BLOCKING)
call_user_func_array($callback, [$data, $count]);
}
}
class Bar {
public function test() {
$a = new Foo();
$a->mDo([$this, 'callback']);
}
public function callback($data, $count) {
print($data);
print($count);
}
}
$bar = new Bar();
$bar->test();
答案 1 :(得分:2)
OOP是你的朋友。将回调声明为类:
class BarCallback {
private $count;
public function __construct($count) {
$this->count = $count;
}
public function callback($data) {
// do work here
}
}
然后Bar
看起来像这样:
class Bar {
public function test() {
$count = 0;
$foo = new Class();
$bar_cb = new BarCallback($count);
$foo->calling([$bar_cb, 'callback']);
}
}
这有帮助吗?
答案 2 :(得分:-1)
这是我的解决方法我将一个类方法调用包装在一个闭包中并传递$,因为PHP缺乏对它的支持。即使该对象通过引用传递给它,它也可以工作。
请参阅:Why can I not use $this as a lexical variable in PHP 5.5.4?
class Bar{
public function test(){
$that = $this; // Workaround for PHP's "Cannot use $this as lexical"
$count = 0;
$foo = new Class();
$foo->calling(function($data) use($that,$count){
$that->barFunction($data, $count);
});
public function barFunction($data, $count){
//...
}
}