在PHP中依赖垃圾收集器是一种好的做法吗


Is it a good practice to rely on garbage collector in PHP?

我有两种方法:

public function a()
{
    $db = new Database();
    $db->query ('....');
    // $db->close();
}
public function b()
{
    $db = new Database();
    $db->query ('....');
    // $db->close();
}

他们按顺序呼叫:

$obj->a();
$obj->b();

我有意评论close()方法。这个Database类有一个析构函数方法:

class Database
{
    public function __destruct()
    {
        $this->close();
    }
    public function close()
    {
    }
}

我想要自动关闭方法调用之间的数据库连接。要做到这一点,100%肯定的方法是调用Database::close方法,但我希望它是自动的,并在方法结束时完成。这条路安全吗?因为我不知道垃圾收集器什么时候真正删除了那个$db对象。如果b()运行时它仍然存在怎么办?从理论上讲,垃圾收集者在觉得。。。

编辑

数据库关闭只是一个例子!我想做一些其他的事情,但这是一个很好的例子,不要专注于结束本身!!

在每次方法调用后关闭DB连接不是一个好主意。

通常,人们在整个脚本生命周期中创建并保持一个连接。

当然,我假设您的项目中有一个DB。

你的想法是一个糟糕的设计例子。我建议你复习一下你的建筑设计。

根据我的经验,在完全完成可重用对象之前,通常不应该关闭/销毁该对象,尽管也有一些例外。

如果您知道您将多次调用该进程,那么在进行最后一次调用之前,不应该销毁该对象。一个例外是,如果在对象内部,您正在处理另一个对象或在每个循环完成时需要强制释放的大量数据,那么在完成该循环后,您应该只销毁正在消耗或可能消耗大量资源的对象。

至于__destruct()函数,您应该将销毁对象所需的所有代码都放在其中。从该对象中调用另一个函数就是我们程序员所说的循环引用,其中一个空间的内存指向它自己,可能会导致垃圾收集失败。

从PHP中释放内存的最高级别控制是对要销毁的对象使用unset()命令。在指向类的对象指针上使用unset()将调用该类的__destruct()函数。

在对象上执行unset()告诉GAC在需要资源来清除使用该命令引用的对象时给予更高的优先级。当在对象中使用内存密集型循环或编写不好的类时,这就是为什么它很有用。

相关文章: