簡體   English   中英

PHP 什么時候調用析構函數?

[英]When is the destructor called in 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 會在腳本的最后自動調用這個函數。

演示

PHP 代碼完成后,您可以使用register_shutdown_function工作...


<?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方法也是一個神奇的方法,當對象從內存中刪除不需要調用它時,該方法自動工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM