遇到“致命错误”时未调用对象析构函数

时间:2013-01-15 14:16:59

标签: php error-handling

我的模型中有以下逻辑:

if ( $switch_obj->connect() )  {
  if ( $data = $switch_obj->showIntAll() )  {
        $switch_obj->disconnect();  
        return $data;
  }
  else  {
     $switch_obj->disconnect();
     throw new Exception('Empty Data Set');
  }
}
else  {                                     
   throw new Exception('Connection');                                  
    }

这个被调用的switch_obj在它的构造函数和析构函数中都有逻辑,分别用于递增/递减计数器。 (保存在名为testclass的类中)。 因此,每次实例化类型为testclass的对象时,计数器都会增加。然后当被摧毁时,它就会减少。 但是,我刚刚发现了一个我没有处理过的场景。

  

致命错误:调用未定义的方法testclass :: showIntAll()in   第215行的/var/www/myapp/application/models/test_model.php

很明显,我正在调用一种不存在的方法,我将解决这个方法。但我的问题是:在创建此错误时,我可以看到计数器已经递增...但没有递减,因为一旦抛出此错误,它永远不会返回到我的类中的析构函数方法。 我将如何为这些类型的场景编程?显然,在生产中,由于缺少testclass中的方法,我不会得到错误...但是如果我在调用testclass构造函数时遇到意外错误然后它就会发生炸弹,我只是想知道最好的方法是什么是为了解决这个问题。

2 个答案:

答案 0 :(得分:2)

您可能会使用register_shutdown_function取得成就。您的构造函数可以注册一个清理函数,如果发生错误,将会调用该函数。你必须小心不要两次调用清理代码(一次来自析构函数,一次来自这个注册函数。

不是一个漂亮的解决方案,但它可以工作:)

答案 1 :(得分:1)

据我所知,析构函数不会被称为致命错误