Какой смысл обнулять частные переменные в деструкторе? - PullRequest
4 голосов
/ 21 декабря 2010

Я обнаружил следующий шаблон в коде, с которым я работаю: в некоторых классах в деструкторе я обнаружил, что частная переменная обнуляется, например:

public function __destruct()
{
    foreach($this->observers as $observer)
    {
        $observer = null;
    }
    $this->db_build = null;
}

Есть ли смысл делать это, когдаPHP имеет GC?Это как-то улучшает производительность скрипта?

Ответы [ 3 ]

3 голосов
/ 21 декабря 2010

Иногда это просто для мема чистоты.Но в вашем примере оба $observer и ->$db_build ссылаются на подобъекты.Таким образом, здесь есть намерение уничтожить их до уничтожения текущего объекта.(Хотя я не уверен, что ядру Zend действительно нравится, когда его прерывают, когда он находится в разрушительном буйстве. Возможно, у него есть список спула или что-то в этом роде.)Но это может быть разумно, если составные подобъекты имеют некоторые зависимости;например, счетчики или сами ссылки в реестре.Итак, в большинстве случаев не нужно, я бы сказал.

Я сделал глупый пример, демонстрирующий порядок __destruct:

class dest {
        function __construct($name, $sub=NULL) {
                $this->name = $name;
                $this->sub = $sub;
        }
        function __destruct() {
                print "<destroying $this->name>\n";
                $this->sub = NULL;
                print "</destroying $this->name>\n";
        }
}

$d = new dest("first", new dest("second", new dest("third")));
exit;

Без $this->sub = NULL уничтожения объектовкаждый бы происходил индивидуально, не обязательно в порядке создания экземпляров.При ручном сбрасывании составных объектов, однако, PHP уничтожает три объекта вложенным способом:

<destroying first>
    <destroying second>
        <destroying third>
        </destroying third>
    </destroying second>
</destroying first>
2 голосов
/ 21 декабря 2010

Это может быть, потому что сборка мусора в PHP основана на подсчете ссылок , а более старые версии не могут обрабатывать циклические зависимости.Затем в некоторых случаях было бы необходимо вручную установить ссылки на нуль, чтобы позволить ГХ выполнять свою работу, и все же могут быть некоторые особые случаи, когда алгоритм обнаружения цикла не перехватывает.

Скорее всего, это всего лишь пример программирования культа груза (в записи Википедии даже явно указан этот пример).

0 голосов
/ 21 декабря 2010

первый - это хороший тон программирования, второй - освобождает память скриптов. если сразу после вызова деструктора PHP скрипт завершится, я не вижу никаких преимуществ.

...