【问题标题】:Saving in the destructor - bad idea?保存在析构函数中 - 坏主意?
【发布时间】:2012-03-06 08:36:12
【问题描述】:

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

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

【问题讨论】:

  • 你怎么知道在析构函数中保存是合适的?也许用户按下了取消.....
  • @MitchWheat 因为它是一个网络应用程序,所以对象只在一个请求的生命周期内存在。因此,在此期间不可能取消。

标签: php orm destructor


【解决方案1】:

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

【讨论】:

  • 被销毁的 DB 对象是 kicker。
  • PHP 只对没有引用的对象调用 __destruct 函数。因此,如果您有对 DB 对象的引用,它不会在您有机会使用它之前被销毁。
【解决方案2】:

IMO,将此类功能添加到析构函数中并不是最佳选择。对我来说非常重要的一个原因是代码复杂性增加和可读性降低。刚接触该项目的第三个人最终会花费相当多的时间来弄清楚发生了什么。

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

【讨论】:

    【解决方案3】:

    实际上,PHP 会尝试以正确的顺序销毁对象,因此它是非常安全的(考虑到如果您尝试保存某些内容,这意味着您仍在持有对它的引用)。你需要注意的是,在析构函数中抛出异常会导致致命错误,即使有catch。您可以玩示例,并且通过正常引用使 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;
    

    【讨论】:

    • 当我将最后一行更改为$b-&gt;a = $b; 时,PHP 仍然会首先尝试解构$a
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多