我有一个
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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。