我有一个看起来像这样的 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 之前调用。
有没有办法以优雅的方式解决这个问题?