有没有办法在PHP匿名函数中捕获$ this?

我有一个如下所示的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之前被调用。

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


感谢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);
链接地址: http://www.djcxy.com/p/67207.html

上一篇: Is there a way NOT to capture $this in a PHP anonymous function?

下一篇: Finding a representative mean INTERIOR point for a non