PHP 在调用返回后是否会垃圾收集函数范围内的对象?

Jef*_*ett 5 php memory phpunit memory-management

我知道一旦脚本结束,所有对象都会被销毁并返回内存。一旦函数结束且无论如何都无法访问的函数范围对象是否也会发生这种情况?

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

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

我应该unset在“Absterge”部分中手动将它们设置为长时间运行的脚本吗?

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

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

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

    // Absterge
    unset($myObject);
}
Run Code Online (Sandbox Code Playgroud)

Eve*_*ert 5

一旦对某个对象的所有引用都消失了,PHP 将进行垃圾收集。

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

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

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

https://www.php.net/manual/en/info.configuration.php#ini.zend.enable-gc

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