PHP将额外参数传递给回调函数

10
有没有办法向回调函数传递额外的参数?
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
      });
  }

我真的不太明白你想做什么?上面那段是伪代码吗?calling看起来像什么? - Rizier123
我添加了一个使用闭包实现的示例,但我如何改用类方法来实现呢? - Tom
2个回答

4

可以使用 call_user_func_array

call_user_func_array([$context, $function], $params);

例如,在您的示例中,$context 将是 Bar($this),$function 将是您的 'barFunction',参数将是 [$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();

由于calling()提供了$data,那么它是否被定义了呢? - Tom
@Tom 我提供了一个完整的例子。 - Tyler Sebastian
那样做可以,但我无法编辑mDo方法。我提供了一个使用闭包实现我想要的效果的示例,但我需要使用类方法来实现。 - Tom
对于我的使用情况来说,似乎有点过头了。 - Tom
我不明白为什么你需要使用反射——似乎有些过度了。 - Tyler Sebastian

3

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']);
  }
}

这有帮助吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接