【问题标题】:Replacement or equivalent to __destruct() and unset() for PHP 7+替换或等效于 PHP 7+ 的 __destruct() 和 unset()
【发布时间】:2022-01-25 23:56:46
【问题描述】:

我正在经历将我们的约会网络应用程序更新到 PHP 7+ 以上的过程

感谢本网站的帮助,我一直在更新已弃用的代码并消除出现的错误,并且对我们已弃用的 __destruct() 函数有疑问。

我搜索了我遇到的错误,并在 github 上找到了解决我问题的链接:https://github.com/sajari/simple-linkedin-php/issues/4

所以据说 destruct 函数在 PHP 7 之后中断,并且将它们注释掉确实解决了我的问题,但这让我很担心。

编辑:Destruct 仍然有效,这正是我过时的代码尝试的方式 使用它

我在我们的一个类文件中调用了 destruct 的一个特定实例,该类文件根据用户从我们的数据库中查询的作业构建作业请求页面。

/** free up memory
    $tmp->__destruct();
    unset($tmp);
**/

据我所知,一切正常,但我想知道这样做的后果是什么。我应该用一些更新的内存清理方法替换它吗?这个应用程序已经过时了,我想知道是否还需要进行这种清理,或者故意放入以阻止内存泄漏。我的老板似乎也不知道。

从专业角度来说,我是 PHP 新手,希望确保此更新仍能为我们的客户提供相同水平的速度和可用性。

这里提出的另一个 stackoverflow 问题:Deletion of a PHP object; also unset() and __destruct

用户回答说,脚本的完整执行已经清除了这些值,但是可以明确清除以停止任何无意的引用。

这只会导致更多问题。当那个用户指的是脚本时,他们指的是特定的函数调用吗?

总结一下,假设 destruct 和 unset 调用是为了阻止内存泄漏,它的等效替代品是什么?

谢谢!

为了我自己,我想亲自将此问题标记为已回答。它 非常有帮助!

【问题讨论】:

  • __destruct() 在 PHP7 中没有被删除或破坏,但他们在您链接的 GitHub 问题中使用它的方式不是正确的使用方式。在我的 IDE 中,他们的代码中的错误是 Cannot reassign $this,因为 unset($this); 没有任何意义。但是,不需要调用$tmp->__destruct(),因为unset($tmp) 会自动运行它。请参阅php.net/manual/en/language.oop5.decon.php 了解更多信息。
  • 嘿,我刚刚测试了该修复程序,现在一切似乎都运行良好。我不知道为什么会这样写,因为我不是原作者。我想更新我的问题,因为我仍然想知道是否需要明确的 unset 调用。

标签: php


【解决方案1】:
$tmp->__destruct();
unset($tmp);

你不应该像这样直接调用析构函数。单独调用unset($tmp) 将间接导致析构函数在对象被移除时触发。所以,这段代码实际上导致析构函数被调用了两次,这几乎肯定不是你想要的。

当该用户指的是脚本时,他们指的是特定的函数调用吗?

不,它们意味着一个特定的 PHP 执行,从第一个文件的第一行到最后一个文件的最后一行。在执行结束时,一切都会自动释放。在 PHP 中,此执行运行通常指的是一个简短的 Web 请求,因此几乎不需要为了“释放内存”而显式调用 unset(),因为一旦请求完成,就会立即发生隐式 unset()完毕。您只需要担心手动执行此操作,例如,$tmp 对象在请求开始时使用大量内存,在请求的其余部分不需要它,并且运行很长时间。如果你只是在请求结束时调用unset(),那是没有用的。

删除这两行很可能是安全的。第一个是多余的,第二个几乎不需要。

注意,使用unset() 从作用域中删除变量比释放内存更有可能,因此请注意扫描以后是否有某些代码需要$tmp不需要存在。

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 2019-05-19
    • 2012-08-22
    • 2012-07-18
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多