2010-01-13 2 views
0

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

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

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

Edit:

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

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

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

ответ

1

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

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

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

+0

Принято из-за отличной ссылки. Все блестящие ответы! Благодаря :) – Louis

5

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

+2

Подробнее: http://us.php.net/manual/en/language.references.arent.php –

4

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

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

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

0

PHP global or $GLOBALS

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