Подсчет ссылок в php - как это работает?
Я пытаюсь понять эту статью " Руководство по PHP -> Функции -> Сборка мусора" к сожалению, для меня мало что неясно.
1.
Чтобы избежать необходимости вызывать проверку циклов мусора при каждом возможном уменьшении количества ссылок, алгоритм вместо этого помещает все возможные корни (zvals) в "корневой буфер".
Но что в случае
<?php
$a = new \stdClass(); (1)
$a = new \stdClass();
Тогда я предполагаю, что первым объектом станет "потерянный" звал как
No_symbol: (refcount=1, is_ref=1) = стандартный объект
Будут ли такие "потерянные" звалы добавлены в корневой буфер или нет? Для них нет обработчика.
2.
Переменные, созданные в области действия функции, что с ними произошло?
Пример:
<?php
function test($a = 'abc') {
$c = 123;
return 1;
}
test();
echo 'end';
Что произошло с $a и $c при запуске gc? Для этих переменных по-прежнему установлено значение refcount равное 1. Будут ли они по-прежнему удалены? если да, то почему и как (что происходит под прикрытием?)
3.
Как это может быть помощь в циклических ссылках?
Пример
<?php
$a = array('abc');
$a[] =& $a;
unset($a);
Где
(refcount=1, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='abc',
1 => (refcount=1, is_ref=1)=...
)
1 answers
1) Исходный объект заменяется новым, и, таким образом, память мгновенно освобождается.
echo memory_get_usage().'<br/>';
$a = new stdClass();
echo memory_get_usage().'<br/>';
$a = new stdClass();
echo memory_get_usage().'<br/>';
2) Они обрабатываются в ту секунду, когда функция завершает выполнение:
echo memory_get_usage().'<br/>';
function test($a = 'abc') {
$c = 123;
return 1;
}
echo memory_get_usage().'<br/>';
test();
echo memory_get_usage().'<br/>';
3) при сбросе $a указанная переменная останется в памяти. Сначала вам нужно установить значение NULL, а затем отменить его.
echo memory_get_usage().'<br/>';
$a = array('abc');
echo memory_get_usage().'<br/>';
$a[] =& $a;
echo memory_get_usage().'<br/>';
$a = null;
unset($a);
echo memory_get_usage().'<br/>';