Как уничтожить объект? - PullRequest
106 голосов
/ 10 января 2012

Насколько я знаю (что очень мало), существует два способа:

$var = new object()

Тогда:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 

Другой лучший метод? Я расщепляю волосы здесь?

Ответы [ 6 ]

134 голосов
/ 10 января 2012

Вы ищете unset().

Но учтите, что вы не можете явно уничтожить объект.

Он останется там, однако, если вы сбросите объект, и ваш скрипт выдвинет PHP в память, то ненужные объекты будут собираться мусором.Я бы пошел с unset() (в отличие от установки его на ноль), поскольку он, кажется, имеет лучшую производительность (не проверено, но документировано в одном из комментариев из официального руководства PHP).

Тем не менее, имейте в виду, что PHP всегда уничтожает объекты, как только страница обслуживается.Так что это нужно только на очень длинных циклах и / или на страницах с интенсивной интенсивностью.

8 голосов
/ 11 февраля 2014

Удобный пост, объясняющий несколько неправильных представлений об этом:

Не вызывайте деструктор явно

Это охватывает несколько неправильных представлений о том, как работает деструктор. Вызов его явно не уничтожит вашу переменную, согласно документу PHP5:

PHP 5 вводит концепцию деструктора, аналогичную концепции других объектно-ориентированные языки, такие как C ++. Метод деструктора будет называется, как только нет других ссылок на конкретный объект или в любом порядке во время последовательности выключения.

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

1 голос
/ 18 апреля 2018

Краткий ответ: оба необходимы.

Я чувствую, что правильный ответ был дан, но минимально.Да, вообще unset () лучше всего подходит для «скорости», но если вы хотите немедленно восстановить память (за счет ЦП), следует использовать нуль.

Как и другие упомянутые, установка на ноль не означает, что все исправлено, у вас могут быть объекты с общей памятью (неклонированные), которые предотвратят уничтожение объекта.Более того, как уже говорили другие, вы все равно не можете явно «уничтожить» объекты, поэтому вам все равно не следует пытаться это делать.

Вам нужно будет выяснить, что лучше для вас.Также вы можете использовать __destruct () для объекта, который будет вызываться как unset или null, но его следует использовать осторожно и, как говорили другие, никогда не вызываться напрямую!

см .:

http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/

В чем разница между назначением NULL и unset?

0 голосов
/ 26 октября 2018

Может быть в ситуации, когда вы создаете новый объект mysqli.

$MyConnection = new mysqli($hn, $un, $pw, $db);

, но даже после закрытия объекта

$MyConnection->close();

если вы будете использовать print_r() для проверки содержимого $MyConnection, вы получите ошибку, как показано ниже:

Error:
mysqli Object

Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)

, в этом случае вы не можете использовать unlink(), потому что unlink() потребуется строка с именем пути, но в этом случае $MyConnection является объектом.

Таким образом, у вас есть другой выбор установки его значения в нуль:

$MyConnection = null;

Теперь все идет хорошо, как вы и ожидали.У вас нет содержимого внутри переменной $MyConnection, так как вы уже очистили объект mysqli.

Рекомендуется закрыть объект перед установкой значения переменной null.

0 голосов
/ 05 сентября 2018

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

$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;

возвращает

2

Смотрите это в действии здесь: https://eval.in/1054130

0 голосов
/ 10 января 2012

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

...