[英]When is the destructor called in 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.