PHP 是否在调用 returns 后垃圾收集函数范围的对象?

Does PHP garbage collect function-scoped objects after a call returns?

我知道一旦脚本结束,all objects are destroyed 和内存就会返回。一旦函数结束而无论如何都无法访问,这是否也会发生在函数范围的对象上?

例如,我担心我的 PHPUnit 测试中的内存泄漏,其中我几乎为每个测试都创建了一个新对象。如果我 运行 足够的测试,这最终会溢出我的堆吗?

public function testMyFunction()
{
    // Arrange
    $myObject = new MyClass();

    // Act
    $return = $myObject->myFunction();

    // Assert
    $this->assertEquals(true, $return);

}

我是否应该在 "Absterge" 部分手动 unset 将它们设置为长 运行ning 脚本?

public function testMyFunction()
{
    // Arrange
    $myObject = new MyClass();

    // Act
    $return = $myObject->myFunction();

    // Assert
    $this->assertEquals(true, $return);

    // Absterge
    unset($myObject);
}

PHP 将在对对象的所有引用都消失后进行垃圾收集。

unset 不需要。但是,您可能有循环依赖,在这种情况下它可能不会被垃圾收集。

使用 unset() 的唯一原因是如果您想在函数结束前 释放内存。如果还有其他东西持有对您要取消设置的东西的引用,unset() 只会删除局部变量,而不是对象本身。

有一个特殊的垃圾回收周期可以清除循环引用。您可以使用 php.ini 设置来控制它:

http://ca2.php.net/manual/en/info.configuration.php#ini.zend.enable-gc

如果您有兴趣测试您的对象何时以及是否被垃圾收集,您可以添加一个 __destruct 方法。