PHP отключен через ссылки - PullRequest
       20

PHP отключен через ссылки

0 голосов
/ 14 января 2010

Я читал руководство по PHP о ссылках, и что-то меня смущает. В нем говорится, что ссылки - это не указатели на адреса памяти, а ...

Вместо этого они являются таблицей символов псевдонимы.

Разве это не указатель, если ссылка указывает на запись таблицы символов, которая затем указывает на адрес памяти?

Edit:

Несколько замечательных ответов. Просто хочу добавить это сюда ... Как бы я сбросил переменную, на которую указывает другой?

$var = "text";
$ref =& $var;
unset($ref);

Похоже, чтобы это работало, мне нужно сбросить $var, чтобы GC удалил его.

Ответы [ 4 ]

5 голосов
/ 14 января 2010

Дело в том, что вы не можете выполнять арифметические операции над «указателем», как в некоторых других языках, например С. В этих других языках вы можете делать что-то вроде «указателя ++» и, таким образом, делать один шаг вперед в память. Это невозможно в PHP.

4 голосов
/ 14 января 2010

Невозможно сбросить переменную через ссылку, потому что unset () фактически удаляет ссылку, а не значение. Затем сборщик мусора очищает каждую переменную, на которую нет ссылок, включая исходное имя переменной.

И это хорошо. Представьте себе два объекта, содержащих ссылки на третий в частных переменных. Если один объект отменяет свою частную переменную, другой не будет затронут.

Это нарушило бы публичную / приватную модель, если бы вы могли удалить через ссылки.

2 голосов
/ 14 января 2010

Существует замечательное Учебное пособие по PHP , которое должно объяснить все более подробно, чем сами документы PHP ( gasp ), даже если так чтобы объяснить, что происходит при создании переменной.

PHP внутренне реализует переменную значения через структуру, известную как _zval_struct, обычно называемый просто zval. В дополнение к хранение ценности и информации о своем типе, звал также указывает рефконт Рефконт подсчитывает количество ссылок на значение и имеет важное значение для работа сборщика мусора, позволяя освободить память, когда она больше не используется.

Ссылка в PHP это просто переменная, соответствующая той же Звал как другая переменная. Рекомендации может быть явно создан с использованием особая форма задания действует с амперсандом после равных знак.

0 голосов
/ 14 декабря 2012

PHP глобальный или $ GLOBALS

От @Artefacto: «Внутри функции, если вы хотите сбросить глобальную переменную, вы должны использовать unset ($ GLOBALS ['varname']), а не глобальный $ varname; unset ($ varname) ;."

...