переменная освобождается при unset()
если нет на переменную ссылок (у каждой переменной существует счетчик внутренних сылок, это когда переменную присваивают др переменной, то счетчик увеличивается и наоборот - когда ссылающаяся переменная либо освобождается, либо ей присваивается иное значение - то счетчик уменьшается):
$a=45; -> refcount 1;
$b=$a; -> refcount 2;
$c=$a; -> refcount 3;
$c=1; -> refcount 2;
unset(b) -> refcount 1;
как только refcount=0 - переменная при проходе сборщика мусора - удаляется
в общем у Дерика в слайдах это хорошо расписано:
References in PHP
An In-Depth Look
by Derick Rethans