PHP сборка мусора при обнулении

Если бы я должен был сделать это:

$bob = new Bob();

function AnnoyBob( Bob $bob )
{
$bob = NULL;
} // < A

AnnoyBob( $bob );

A: Есть ли $bob Теперь потерять свою ссылку на исходный указатель и теперь указывают на NULL таким образом, собираясь на следующем собрании?

$bob = new Bob();

function AnnoyBob( Bob $bob )
{
unset( $bob );
} // < B

AnnoyBob( $bob );

B: Это $bob указатель сейчас мгновенно освобождает память для перезаписи?

C: Что делать, если вместо этого вы должны передать ссылку здесь: ..( Bob &$bob )

введите описание изображения здесь

Суть в том, что я вижу, как люди обнуляют указатели, не понимая, что они сейчас покидают GC, чтобы выполнить свою грязную работу … тогда как, если вы используете unset, мне интересно, если он явно помечает его как доступный для перезаписи тогда и там (удалено) !

1

Решение

Вы будете когда-либо изменять только переменную внутри функции. Ваш Bob Экземпляр будет продолжать существовать, потому что переменные вне функции по-прежнему ссылаются на него. Боб не будет собирать мусор, пока все ссылки на него исчезли / стали недоступны.

Экземпляр объекта существует где-то в пуле экземпляров объектов в памяти. Переменная «содержащая объект» на самом деле просто содержит идентификатор этого объекта в памяти. Если вы отменяете или перезаписываете эту ссылку, сам объект не изменяется. Передавая его в функцию, вы просто передаете копию идентификатора в функцию; затем см. предыдущее предложение.

Если вы передаете его по ссылке, вы можете изменить содержимое переменной вызывающей стороны. Если вы просто unset эта переменная просто сбрасывает ее внутри функции, поэтому с Бобом ничего не происходит. Только если вы передадите его по ссылке и переназначите другое значение этой переменной, Боб получит сборщик мусора.

Т.е. только в этом сценарии вы перезаписываете последнюю ссылку на объект и заставляете ее собирать мусор:

$bob = new Bob();

function AnnoyBob(Bob &$bob) {
$bob = NULL;
}

AnnoyBob($bob);
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]