Несколько причин делать unset для переменных

Несколько причин делать unset для переменных

Сообщение Enyby » 08 дек 2011, 00:17

Итак. Довольно часто сталкиваюсь с php кодом. Этот самый код редко содержит unset, хотя, иной раз, это важно. Приведу свой список причин, почему это важно.

  1. Переменная занимает память. Когда это скрипт на один раз и на время меньшее секунды, то это не проблема. Но завтра ваш код в составе "монстра" много часового выполнения и расходование даже 100 байт в секунду, весьма ощутимая величина. Делая unset вы облегчаете себе жизнь.
  2. Пределы использования переменной четко обозначены. Вы четко знаете, что дальше за unset никто не может использовать это значение переменной (но никто вам не мешает использовать эту переменную повторно). Это несомненный плюс, потому что это прозрачно. Вам не надо просматривать кучу подключаемого кода на предмет "а вдруг там кто-то ее использовал". Хотя глобальные переменные это зло, они используются повсеместно. Ситуация осложняется повторным использованием переменной и вам надо отслеживать момент, когда туда было что-то записано, а иногда это не так уж и просто. Например, это где-то в функции, которая вызывается по неким условиям и совершенно не ясно, отработает она или нет.
    Если же стоит unset, то вы четко знаете, что отслеживая все между инициализацией и unset - вы не пропустите ничего.
  3. Меньше используемых переменных. Когда у вас валится код и вы пытаетесь получить стек переменных, а там масса мусора, то это проблема. А если вы пишете еще все это в лог, то там такая мусорка, что и подойти страшно, а не то что ковыряться.

Немного о механизме работы unset:
В памяти есть значение вашей переменной. В вашей переменной указана ссылка на это значение. У значения есть счетчик ссылок. Каждый раз как вы создаете ссылку, этот счетчик увеличивается на единицу, а как уничтожаете - уменьшается. Когда счетчик равен нулю, то ссылок нет и память освобождается.
Из всего выше изложенного следует очень простой факт, unset не удаляет значение переменной, он удаляет ссылку.
Следствия:
  1. unset не всегда освобождает память, а только тогда, когда это была последняя ссылка на объект.
  2. Использование unset "безопасно" в том смысле, что если вам это значение не нужно, вы можете сделать unset и не будет проблем связанных с тем, что вы уничтожили значение, в то время как на него кто-то ссылался.
    Пример:
    Код: Выделить всё
    $a = "test string";
    $b = new stdClass();
    $b->c = $a;
    unset($a);
    echo $b->c;

    В данном случае unset ничего особо не сделал. Значение как было, так и осталось в памяти. Подобное поведение работает везде. Даже, если вы используете вызовы расширения. Например:

    Код: Выделить всё
    $proc = new XSLTProcessor;
    $proc->importStyleSheet($xsl);
    unset($xsl); // It's safe

Резюмируя: используя unset вы исключаете всякое использование значения этой переменной после unset, а действительное уничтожение значение с освобождением занимаемой произойдет лишь тогда, когда оно действительно никому не нужно.
Не важно кто я в глубине души, о человеке судят по поступкам.
Enyby
Администратор
 
Сообщения: 153
Зарегистрирован: 22 фев 2010, 07:54

Вернуться в PHP

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron