Как уничтожить объект?

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

$var = new object()

Затем:

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

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

Ответ 1

Вы ищете unset().

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

увидеть:

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

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

Ответ 4

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

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

возвращается

2

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

Ответ 5

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

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

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

$MyConnection->close();

если вы будете использовать print_r() для проверки содержимого $MyConnection, вы получите ошибку, как $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.

Ответ 6

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