7

PHP 中的对象销毁有多重要?使用 PHP 后销毁对象重要吗?因为与 java 不同,PHP 没有垃圾收集器(我不知道)

4

5 回答 5

14

在一般情况下,您不需要销毁对象,而且 PHP 确实有一个垃圾收集器。此外,大多数简单的脚本甚至都不需要,因为每个 HTTP 请求都会拆除和重建整个环境;垃圾收集器帮助那些在服务单个请求时内存不足的脚本。

一般情况的例外情况:

您可能希望“丢失”对消耗大量内存和/或包装非托管资源的对象的所有引用;这通常很简单

$largeObject = null; // reference to previous value lost

如果那是对 的最后一次引用$largeObject,那么:

  • PHP 将立即调用析构函数(如果存在);如果您的脚本是长期存在的,您可能希望对包装非托管资源(例如数据库连接、套接字等)的对象执行此操作。
  • 对象占用的内存现在可以进行垃圾回收了。但是,收集不会在现场进行,而是在稍后需要更多内存的时候进行(尽管您可以随时调用gc_collect_cycles强制垃圾收集)。

当然,在“服务请求然后退出”的典型情况下,所有这些都没有考虑在内。

于 2012-06-23T15:33:17.523 回答
2

通常这不是您必须考虑的问题。这是一篇关于遇到此问题的人的文章。

http://paul-m-jones.com/archives/262

你可以使用这个函数来破坏你喜欢的类中的任何对象。

function __destruct()
{
    //do stuff
}

只要脚本保持运行,对象就可以在请求期间或从命令行调用时保留在内存中。

于 2012-06-23T15:36:40.973 回答
0

PHP 5.3有一个内置的垃圾收集(也称为 GC)机制。

<?php
    gc_enable(); // Enable Garbage Collector
    var_dump(gc_enabled()); // true
    var_dump(gc_collect_cycles()); // # of elements cleaned up
    gc_disable(); // Disable Garbage Collector
?>

希望能帮助到你!:)

于 2012-06-23T15:35:27.297 回答
0

php 有一个垃圾收集器,但实际上有很多情况下 php 直到unset函数执行时才释放内存。这些案例是关于单例,xml,可能是结构。在我们公司,我们修补了 php 并记录了所有内存分配,并在代码中添加了 unset 函数。但在 Web 开发中,这并不是那么重要。

于 2012-06-23T15:38:37.100 回答
0

正如其他人所建议的那样,垃圾收集将在执行结束时完成这项工作,但是如果您有一个长时间运行的 cron,那么如果/当您处理大量数据或庞大的数组时,您可能会遇到问题。

此时的解决方案是使用 unset($object) 调用对象魔术 __destruct() 函数,如果您想对对象执行任何操作(例如将数据保存在数据库中),您可以使用该函数。

于 2012-06-23T15:47:34.100 回答