在PHP中什么时候调用析构函数



我读过这个答案:

PHP中的析构函数是可预测的吗?

但是仍然不能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%确信在所有情况下(是否例外(,函数结束后,析构函数将首先被调用

我的初步测试表明,是的,无论是否异常,析构函数都会立即调用。但我想要一个确认,最重要的是,一个指向相关文档的指针。

来源https://www.php.net/manual/en/language.oop5.decon.php#object.destruct

一旦没有对特定对象的其他引用,就会调用析构函数方法,或者在关闭序列中按任何顺序调用。


在您的情况下,当任何地方都不再引用$tx时,就会发生这种情况。这将在我们完成doSomething()之后立即进行,除非例如在txManager中存储了另一个引用。

当对象被析构函数或脚本被停止或退出。如果您创建一个__destruct((函数,PHP将在脚本结束时自动调用此函数。

演示

您可以使用register_shutdown_function在PHP代码完成时工作。。。


<?php
function shutdown()
{
// This is our shutdown function, in 
// here we can do any last operations
// before the script is complete.
echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');

__desctruct方法也是一种神奇的方法,当从内存中删除对象时,该方法会自动工作,无需调用

最新更新