Сохранение в деструкторе - плохая идея? - PullRequest
3 голосов
/ 15 февраля 2012

В приложении PHP было бы плохой идеей запускать мой код сохранения во время деструктора объекта?Я спрашиваю, потому что, если все в порядке, тогда я могу добавить вызов save() в деструктор родительского класса Model и избавить себя от необходимости вспоминать где-либо еще.

Я знаю, что это работает, как и яна нем запущено целое приложение (пусть и плохо написанное).Но есть ли веские причины не делать этого?

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Деструктор не гарантированно вызывается в любом порядке. Что происходит, если ваша страница выгружается и все инструкторы объектов начинают вызываться. Вы никогда не знаете, является ли объект базы данных, который вам нужно использовать, по-прежнему действительным или он был выгружен.

1 голос
/ 15 февраля 2012

ИМО, добавление такой функциональности в деструктор - не лучший выбор. Причина, очень важная для меня, заключается в увеличении сложности кода и снижении читабельности. Третий человек, плохо знакомый с проектом, в конечном итоге потратит немало времени на выяснение того, что происходит.

Сказав это, будь то теоретически хорошо или плохо, все зависит от используемой логики программирования. Если рассматриваемый класс будет расширен на более позднем этапе, то save () в вашем деструкторе может принести вам некоторое горе; опять же зависит от того, чего вы пытаетесь достичь.

0 голосов
/ 08 сентября 2012

На самом деле, 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;
...