在PHP中依赖垃圾收集器是一种好习惯吗?

时间:2014-10-10 10:30:38

标签: 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类有一个destruct方法:

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

    public function close()
    {
    }
}

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

修改

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

2 个答案:

答案 0 :(得分:1)

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

通常人们为所有脚本生命周期创建并保持一个连接。

当然,我假设您的项目中有一个数据库。

你的想法是一个糟糕的设计实例。我建议你回顾一下建筑设计。

答案 1 :(得分:1)

根据我的经验,你通常不应该关闭/销毁可重复使用的对象,直到你完全完成它为止,尽管有一些例外。

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

__destruct()函数而言,您应该将所有代码放在那里以销毁对象。从该对象中调用另一个函数是我们程序员调用循环引用的地方,其中一个空间的内存指向自身,并且可能导致垃圾收集失败。

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

对对象执行unset()会告诉GAC在需要资源来清除使用该命令引用的对象时提供更高的优先级。这就是在使用内存密集型循环或对象中写得不好的类时使其有用的原因。