2

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

我注意到析构函数方法调用得太晚了。(数据库类不再活动,memcache 类不再活动)

我发现的解决方法是...

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

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

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

还是我做错了什么可怕的事情?总是必须确保取消设置课程似乎很奇怪。如果我忘记了一次,我的 __destructor 方法会产生错误......

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

4

2 回答 2

1

或者我应该跳过使用析构函数来做依赖于其他类处于活动状态的事情......

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

class Foo
{
  protected $resource;

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

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

这样,您可以显式地“关闭”您的资源,但也可以通过析构函数懒惰地执行此操作,以防万一。

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

于 2012-07-14T20:42:58.830 回答
1

你做得对。但...

在对象的最后一个链接被销毁后,可能会调用析构函数。即使 unset($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
于 2012-07-14T18:29:47.733 回答