如果我们想在__destruct中使用复杂的代码,我们是否应该尽快取消课程设置?

时间:2012-07-14 18:17:49

标签: php class destructor unset

我有以下问题。我正在使用一个类,我想在__destructor方法中执行一些'事件保存(和日志记录)',我需要确保我的数据库类仍处于活动状态,甚至我的memcache类仍处于活动状态。

我注意到析构函数方法可以被称为太迟了。 (数据库类不再处于活动状态,memcache类不再处于活动状态)

我找到的解决方法是......

$forum = new Forum_class();
$forum->output();
unset($forum) <-- unset it

这是一个好习惯吗?或者我应该跳过使用析构函数方法来做依赖于其他类活动的东西...(可用的数据库类,可用的memcache类......)

我很可能不应该尽快取消我的数据库和memcache类,但是对于其他类,你应该尽快取消它们。 (当页面上不再需要它们时)或仅当你想使用__destructor函数时?

或者我做错了什么?总是要确保你取消课程,这似乎很奇怪。如果我忘记了一次,我的__destructor方法可能会产生错误......

编辑:我想我偶然发现了这个错误https://bugs.php.net/bug.php?id=39381。我的数据库类和memcache类使用全局...

2 个答案:

答案 0 :(得分:1)

你做得对。但...

在销毁对象的最后一个链接后调用析构函数。即使未设置($ object)也不能保证在unset()之后立即调用析构函数。

$forum = new Forum_class();
$forum->output();
$forumCopy = $forum;
unset($forum); // php doesnt even consider calling the destructor
unset($forumCopy); // now the destructor is going to be called... in some time

答案 1 :(得分:1)

  

或者我应该跳过使用析构函数方法来做依赖于其他类活动的东西......

基本上,虽然您可以尝试混合方法:

class Foo
{
  protected $resource;

  public function close()
  {
    if ($this->resource)
    {
      $this->resource->foo();
      $this->resource = null;
    }  
  }

  public function __destruct()
  {
    $this->close();
  }
}

通过这种方式,您可以明确地“关闭”您的资源,但也可以通过析构函数懒散地进行,以防万一。

如果清理(close()方法)很关键,那么如果没有清理,我会更改__destruct方法以记录到文件(例如,触发通知)。这样你就可以轻松找到并纠正这些问题。