PHP 中何时不调用 __destruct?

2022-08-30 09:35:32
class MyDestructableClass {
   function __construct() {
       print "\nIn constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "\nDestroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();

当上述脚本处于复杂环境中时,当调用时不会调用,但我无法轻易重现它。有人注意到这一点吗?__destructexit

编辑

我将在这里发布整个内容,它是symfony的测试环境,这意味着如果您熟悉该框架,则可以轻松重现它:

require_once dirname(__FILE__).'/../bootstrap/Doctrine.php';


$profiler = new Doctrine_Connection_Profiler();

$conn = Doctrine_Manager::connection();
$conn->setListener($profiler);

$t = new lime_test(0, new lime_output_color());

class MyDestructableClass {
   function __construct() {
       print "\nIn constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "\nDestroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
$news = new News();

$news->setUrl('http://test');
$news->setHash('http://test');
$news->setTitle('http://test');
$news->setSummarize('http://test');
$news->setAccountId(1);
$news->setCategoryId(1);
$news->setThumbnail('http://test');
$news->setCreatedAt(date('Y-m-d H:i:s',time()));
$news->setUpdatedAt(date('Y-m-d H:i:s',time()));
$news->save();
exit();

答案 1

不会调用:__destruct

  • if 在另一个析构函数中调用exit
  • 取决于 PHP 版本:如果在注册的关机函数中调用exitregister_shutdown_function
  • 如果代码中的某个位置存在致命错误
  • 如果另一个析构函数引发异常
  • 如果尝试在析构函数中处理异常 (PHP >= 5.3.0)

猜猜这就是我现在能想到的

帕斯卡·马丁(Pascal Martin)所说的话。这是调试的第一步。


答案 2

如果脚本在 CLI 上运行并收到 SIGTERM (__destructCtrl+C)


推荐