【发布时间】:2021-02-16 00:28:34
【问题描述】:
我已阅读此答案:
Is destructor in PHP predictable?
但仍然不能 100% 确信 只要对象超出范围就调用析构函数。
我的用例如下:
class Transaction
{
private $isComplete = false;
public function commit() {
// ...
$this->isComplete = true;
}
public function rollBack() {
// ...
$this->isComplete = true;
}
public function __destruct() {
if (! $this->isComplete) {
$this->rollBack();
}
}
}
假设我是这样使用的:
function doSomething() {
$tx = $this->txManager->beginTransaction();
// ... code here may or may not throw an exception
$tx->commit();
}
我能否 100% 确信在所有情况下(无论是否例外),析构函数将是函数结束后立即调用的第一个函数?
我的初始测试表明,是的,无论是否异常,都会立即调用析构函数。但我想要一个确认,最重要的是,一个指向相关文档的指针。
【问题讨论】:
-
你读过PHP documentation about constructors and destructors吗?这是您可以获得的最相关的文档(除了 PHP 的源代码),它说:“只要没有对特定对象的其他引用,或者在关机顺序。”
-
它(几乎)像在
C++中一样保证被调用,而在Java中,对象是垃圾回收的,并且不能保证析构函数被调用。 -
只要是简单的异常(不是一些PHP扩展引起的crash),是,保证调用析构函数为一旦对象超出范围(如果对象范围是函数并且在其他地方没有引用它,就是这种情况)。
标签: php destructor