加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 17:58:13 所属栏目:PHP教程 来源:网络整理
导读:我有一个 PHP代码,如下所示: class A { public function __construct() { $this-b = new B(function($x) { return $x + 1; }); }};class B { public function __construct($dataProcessingFunction) { $this-dataProcessingFunction = $dataProcessingFunct
我有一个 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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读