2015-08-19 2 views
1

Есть ли у кого-нибудь объяснение этому странному поведению php? В принципе, я сделал переменную $ number, а сделал переменную $num2, которая является ссылкой на $number. Поэтому я думал, что оба они будут иметь одинаковое расположение памяти.PHP/сбор мусора, изменяющаяся переменная

Но когда я отключил $number, его все еще выходы .., я подумал, что если я буду использовать некоторые команды gc, это очистит его, потому что это похоже на поведение кучи. Но он все еще не работает. : P

function sum(&$var) { 
    $var++; 
} 
$number = 5; 
$num2 = &$number; 
sum($number); 
echo $number; echo '<br>'; 
gc_enable(); 
gc_collect_cycles(); 
sleep(5); 
unset($number); 
echo $num2; 
+1

Из [php.net] (http://php.net/manual/en/language.references.unset.php): «Когда вы отключите ссылку, вы просто нарушите привязку между именем переменной и содержимым переменной. Это не означает, что содержимое переменной будет уничтожено ». – showdev

+0

В PHP нет «мест памяти» - нет указателей. ссылка SOMEWHAT как указатель на C-код, но не совсем то же самое, и ваше ожидаемое поведение для указателей не может быть применено к php-ссылкам. –

+0

Эй, Марк, так что происходит, если нет мест в памяти? – jojo

ответ

0

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

is described in the PHP docs.

$ mainVar = "Hello!";
$ linkedVar = & $ mainVar;
unset ($ mainVar);

Так что даже после того, как $mainVar не установлено, $linkedVar сохраняет это значение.

+0

Итак, после того как первая переменная не установлена, она делает копию ссылки ref, я правильно понял? – jojo

+0

В принципе, лучший способ подумать о том, что ссылка PHP - это ссылка, которая непрерывно копирует значение mainVar в связанныйVar, но как только mainVar будет уничтожен, ссылка тоже. Таким образом, значение linkedVar остается таким же, как последнее значение mainVar до его уничтожения. –

+0

Итак, в основном var 2 отслеживает 1 для модификаций и изменяется в соответствии с ним. и когда 1 не установлен, он теряет соединение, значит, 2 больше не отслеживает – jojo

Смежные вопросы