我知道一旦脚本结束,所有对象都会被销毁并返回内存。一旦函数结束且无论如何都无法访问的函数范围对象也会发生这种情况吗?
例如,我担心 PHPUnit 测试中的内存泄漏,其中我几乎为每个测试创建一个新对象。如果我运行足够的测试,这最终会溢出我的堆吗?
public function testMyFunction()
{
// Arrange
$myObject = new MyClass();
// Act
$return = $myObject->myFunction();
// Assert
$this->assertEquals(true, $return);
}
我应该手动
unset
在“Absterge”部分中为长时间运行的脚本设置它们吗?
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 设置来控制它:
https://www.php.net/manual/en/info.configuration.php#ini.zend.enable-gc
如果您有兴趣测试对象何时以及是否被垃圾收集,您可以添加一个__destruct
方法。