Ответ 1
Ответ довольно прост, как объясняется в комментариях к вашему вопросу. Хотя, я думаю, я понимаю, откуда твоя путаница, так что пусть это сломается.: D
Сначала вы назначаете значение переменной, внутренне PHP сохраняет это в сегменте памяти и увеличивает счетчик переменных, который ссылается на этот адрес. (Ref = 1). Все прямо вперед до этого момента.
Затем вы повторно используете переменную для хранения ссылки (указатель в C-терминалах) на этот адрес памяти. В руководстве по PHP объясняется это как сохранение ссылки на переменную, чтобы упростить работу программистов, не относящихся к C, и именно там (я думаю) возникает ваше замешательство. Нет такой вещи, как ссылка на переменную во внутренних элементах, только данные, с которыми связана переменная. Поскольку вы повторно использовали переменную для хранения этой ссылки, счетчик ссылок не увеличивается: по-прежнему существует только одна переменная, указывающая на этот сегмент памяти. Тем не менее, это уже не обычная PHP-переменная, а ссылка (указатель) на данные.
Изменить, добавлено:
Другой способ добиться того же результата - использовать две переменные, а затем unset
первую. Пример кода:
$a = 100; // refcount += 1
xdebug_debug_zval ('a'); // refcount=1,is_ref=0 -> zval {value=100,type=int (addr=0x78765asd)}
$b =& $a; // refcount += 1
xdebug_debug_zval ('a') // refcount=2,is_ref=0 -> zval {value=100,type=int (addr=0x78765asd)}
xdebug_debug_zval ('b') // refcount=2,is_ref=1 -> zval {value=100,type=int (addr=0x78765asd)}
unset ($a); // refcount -= 1
xdebug_debug_zval ('b') // refcount=1,is_ref=1 -> zval {value=100,type=int (addr=0x78765asd)}
Использование только одной переменной объединяет две операции в одну, не уничтожая данные. Таким образом: 1 переменная (refcount = 1), которая является ссылкой (is_ref = 1) для самих данных.
Как мы и пытались объяснить вам, путаница проистекает из того, что предпосылка исходного вопроса ошибочна: вы не ссылаетесь на переменную в этих примерах, вы ссылаетесь на область памяти, которая содержит данные, первоначально связанные с указанной переменной. Таким образом, вы переписываете одну (оригинальную) "жесткую ссылку", а другую. Единственное отличие состоит в том, что последний помечен как таковой, по внутренним причинам PHP. (Ссылки не копируются при записи, в случае refcounts > 1.)