在__construct的类变量中存储匿名函数

时间:2014-09-11 21:50:15

标签: php callback closures class-variables

我正在使用一个Thread包装类,它可以接受一个函数并在一个新线程中调用该函数。 到目前为止我的班级:

public function __construct($cbCallback, $aParameters) {

    $this->cbCallback = $cbCallback;
    $this->aParameters = $aParameters;
    $this->return = false;
}

public function run() {

    if (is_array($this->cbCallback)) {

        $this->return = call_user_func($this->cbCallback, ...($this->aParameters));
    }
    else {

        $this->return = $this->cbCallback(...($this->aParameters));
    }
}

这可以在接受回调时使用call_user_func部分。我想重载类,以便它也可以接受闭包而不是回调数组。我在将匿名函数存储为类变量时遇到了麻烦:它始终存储为null。

我在构造函数中放了一些调试语句:

echo "Paramater test 1: " . json_encode($cbCallback);
$this->cbCallback = $cbCallback;
echo "Paramater test 2: " . json_encode($cbCallback);
echo "Variable test: " . json_encode($this->cbCallback);

这会产生输出:

Paramater test 1: {}
Paramater test 2: {}
Variable test: null

我还尝试使用$cbCallback通过引用传递&$cbCallback,这只会导致无法通过引用传递对象的错误。

我觉得要么有一个特殊的规则与匿名函数,或者某些东西正在发生。 为什么我不能将匿名函数存储到$ this-> cbCallback中?有没有办法将匿名函数存储在(非静态)类变量或类似的东西中,当我需要调用该函数时,它会以相同的方式工作?

P.S。我是PHP v5.6

3 个答案:

答案 0 :(得分:1)

如果要执行存储在对象中的闭包,请先尝试将其分配给变量,否则可能会出现“调用未定义的方法”。

而不是

$this->return = $this->cbCallback(...($this->aParameters));

试试这个

$cb = $this->cbCallback;
$this->return = $cb(...($this->aParameters));

答案 1 :(得分:1)

我终于找到了我遇到的问题。事实证明这是pthreads库的一个问题。

只要不扩展Thread类,指定的代码就可以正常工作。

我在php的网站上发现了这个错误报告: https://bugs.php.net/bug.php?id=67506

然后将它发布到krakjoe的github: https://github.com/krakjoe/pthreads/issues/355

原来他在我发布前几个小时就解决了这个问题,所以为了解决这个问题,确保你正在运行pthreads v2.0.9 +

答案 2 :(得分:0)

您可以在类变量中存储闭包或lambda函数/匿名函数。但是,您无法对其进行序列化,因为它不仅仅是一个简单的值,而是一个函数。