php - 如果我们想在 __destruct 中使用复杂的代码,我们是否应该尽快取消设置一个类?

标签 php class destructor unset

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

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

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

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

这是一个好的做法吗?或者我应该跳过使用析构函数方法来执行依赖于其他事件类的操作...(可用的数据库类,可用的内存缓存类...)

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

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

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

最佳答案

你做得对。但是...

析构函数可能会在对象的最后一个链接被销毁后调用。即使 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

关于php - 如果我们想在 __destruct 中使用复杂的代码,我们是否应该尽快取消设置一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486213/

相关文章:

c++ - 派生类销毁后使用基类成员

c++ - 确保从 Fortran 应用程序调用 C++ 析构函数

php - 如何将友好的 url 转换为原始 url

php - 未捕获的 SoapFault 异常 : [Client] Function is not a valid method for this service

java - 2 类依赖?

c++ 继承类中函数重载的问题

c++ - 我可以显式调用类的构造函数和析构函数吗?

PHP 身份验证 - 成员(member)区与公共(public)页面上的额外内容

php - Laravel - API 将字段作为字符串返回,而它们在数据库中是 int

java - 从另一个类更改 jTextField