7

我有一个看起来像这样的 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 之前调用。

有没有办法以优雅的方式解决这个问题?

4

1 回答 1

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);
于 2012-12-12T21:07:05.307 回答