我读过这个答案:
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
方法也是一种神奇的方法,当从内存中删除对象时,该方法会自动工作,无需调用