我正在使用一个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
答案 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函数/匿名函数。但是,您无法对其进行序列化,因为它不仅仅是一个简单的值,而是一个函数。