保存在析构函数中-坏主意


Saving in the destructor - bad idea?

在PHP应用程序中,在对象的析构函数期间运行保存代码会是个坏主意吗?我之所以这么问,是因为如果可以的话,我可以在父Model类的析构函数中添加一个save()调用,这样就省去了记住其他地方的麻烦。

我知道这样做确实有效,因为我有一个完整的应用程序(尽管写得很糟糕)在上面运行。但有充分的理由不这样做吗?

析构函数不能保证以任何顺序调用。如果你的页面正在卸载,并且所有的对象都开始调用讲师,会发生什么。您永远不知道需要使用的数据库对象是否仍然有效,或者它是否已卸载。

IMO,在析构函数中添加这样的功能不是最好的选择。原因之一,对我来说非常重要,是增加了代码的复杂性和降低了可读性。第三个新加入这个项目的人最终会花很多时间弄清楚发生了什么。

话虽如此,无论理论上是好是坏,都取决于所采用的编程逻辑。如果有问题的类在后期会被扩展,那么析构函数中的save()可能会给你带来一些悲伤;再次取决于你想要达到的目标。

实际上,PHP会尝试以正确的顺序销毁对象,所以它是非常安全的(考虑到如果你试图保存某个东西,这意味着你仍然在处理对它的引用)。您需要注意的是,在析构函数期间抛出异常将导致致命错误,即使存在捕获。你可以玩例子,让PHP在正常引用中失败并不容易,这里有一个简单的方法可以让PHP疯狂地使用析构函数,这样它就不知道如何结束它们,但正如我所说,这不是你通常在代码中找到的东西:

<?php
class A
{
    public $b;
    function eco()
    {
        echo 'AAA';
    }
    function __destruct()
    {
        $b->eco();
    }
}
class B
{
    public $a;
    function eco()
    {
        echo 'BBB';
    }
    function __destruct()
    {
        $a->eco();
    }
}
$a = new A;
$b = new B;
$a->b = $b;
$b->a = $a;