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
方法。
我知道一旦脚本结束,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
方法。