Если бы я должен был сделать это:
$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, мне интересно, если он явно помечает его как доступный для перезаписи тогда и там (удалено) !
Вы будете когда-либо изменять только переменную внутри функции. Ваш Bob
Экземпляр будет продолжать существовать, потому что переменные вне функции по-прежнему ссылаются на него. Боб не будет собирать мусор, пока все ссылки на него исчезли / стали недоступны.
Экземпляр объекта существует где-то в пуле экземпляров объектов в памяти. Переменная «содержащая объект» на самом деле просто содержит идентификатор этого объекта в памяти. Если вы отменяете или перезаписываете эту ссылку, сам объект не изменяется. Передавая его в функцию, вы просто передаете копию идентификатора в функцию; затем см. предыдущее предложение.
Если вы передаете его по ссылке, вы можете изменить содержимое переменной вызывающей стороны. Если вы просто unset
эта переменная просто сбрасывает ее внутри функции, поэтому с Бобом ничего не происходит. Только если вы передадите его по ссылке и переназначите другое значение этой переменной, Боб получит сборщик мусора.
Т.е. только в этом сценарии вы перезаписываете последнюю ссылку на объект и заставляете ее собирать мусор:
$bob = new Bob();
function AnnoyBob(Bob &$bob) {
$bob = NULL;
}
AnnoyBob($bob);
Других решений пока нет …