我有以下问题。我正在使用一个类,我想在__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类使用全局...
答案 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
方法以记录到文件(例如,触发通知)。这样你就可以轻松找到并纠正这些问题。