我有一个如下所示的PHP代码:
class A {
public function __construct() {
$this->b = new B(function($x) { return $x + 1; });
}
};
class B {
public function __construct($dataProcessingFunction) {
$this->dataProcessingFunction = $dataProcessingFunction;
}
public function processData($data) {
$f = $this->dataProcessingFunction;
return $f($data);
}
};
但是有一个问题:我绝对需要在A的析构函数之前调用B的析构函数。你可以看到,这似乎是合理的。 B对象不需要任何A,所以应该没有问题。
但是从PHP 5.4.0开始,闭包似乎会自动隐藏$ this。因此,我传递给B并由B存储的lambda函数包含对A的引用。
这意味着A包含指向B的指针,B包含指向A的指针(通过闭包)。在这种情况下,PHP文档说只有垃圾收集和随机顺序调用析构函数。猜猜看:B的析构函数总是在A之前被调用。
有没有办法以优雅的方式解决这个问题?
答案 0 :(得分:4)
感谢Explosion Pills,我在Closure
课程中找到了解决方案。
事实上,您可以更改存储在闭包内的$this
,如下所示:
$cb = function($x) { return $x + 1; };
$cb = $cb->bindTo(null);
// now $cb doesn't contain a pointer to $this anymore
请注意,您无法执行此操作,否则您将收到语法错误:
// syntax error
$cb = (function($x) { return $x + 1; })->bindTo(null);