Наскільки я знаю (що дуже мало), є два способи:
$var = new object()
Тоді:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Інший кращий метод? Я тут розщеплюю волоски?
Наскільки я знаю (що дуже мало), є два способи:
$var = new object()
Тоді:
// Method 1: Set to null
$var = null;
// Method 2: Unset
unset($var);
Інший кращий метод? Я тут розщеплюю волоски?
Відповіді:
Ви шукаєте unset()
.
Але врахуйте, що ви не можете явно знищити об'єкт.
Він залишиться там, однак якщо ви скасуєте об'єкт і ваш скрипт підштовхне PHP до межі пам'яті, об'єкти, не потрібні, збиратимуть сміття. Я б пішов unset()
(на відміну від встановлення його на нуль), оскільки, схоже, має кращі показники роботи (не перевірений, але задокументований на одному з коментарів з офіційного посібника PHP).
Зважаючи на це, майте на увазі, що PHP завжди знищує об'єкти, як тільки сторінка розміщується. Отже, це потрібно лише на дійсно довгих петлях та / або важких інтенсивних сторінках.
unset()
видаляє посилання на Об’єкт?
Зручна публікація, що пояснює кілька помилок з цього приводу:
Це охоплює кілька помилок щодо того, як працює деструктор. Викликаючи це явно, фактично не знищить вашу змінну, відповідно до документа PHP5:
PHP 5 вводить концепцію деструктора, подібну до концепції інших об'єктно-орієнтованих мов, таких як C ++. Метод деструктора буде викликаний, як тільки не буде інших посилань на певний об'єкт або в будь-якому порядку під час послідовності відключення.
У публікації вище зазначено, що встановлення змінної на null може працювати в деяких випадках, якщо нічого іншого не вказує на виділену пам'ять.
Коротка відповідь: обоє потрібні.
Я відчуваю, що правильну відповідь дали, але мінімально. Так взагалі unset () найкраще підходить для "швидкості", але якщо ви хочете повернути пам'ять негайно (за рахунок процесора), ви повинні використовувати null.
Як і інші згадані, встановлення значення "null" не означає, що все відшкодовано, ви можете мати об'єкти спільної пам’яті (незакриті), що запобіжить руйнуванню об'єкта. Більше того, як і інші казали, ви ніяк не можете "знищити" об'єкти явно, тому не варто намагатися це робити.
Вам потрібно буде розібратися, що найкраще для вас. Також ви можете використовувати __destruct () для об'єкта, який буде викликаний unset або null, але його слід використовувати обережно і, як казали інші, ніколи не викликайте прямо!
побачити:
http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/
Це простий доказ того, що ви не можете знищити об'єкт, ви можете знищити лише посилання на нього.
$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;
повертає
2
Побачити це в дії можна тут: https://eval.in/1054130
$var2
що було посилання $var
. Тепер ви також знищуєте $var
і, вважаючи, що немає інших посилань на об'єкт, ви закінчили.
Може виникнути ситуація, коли ви створюєте новий об’єкт 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
.
Я б пішов з невдачею, тому що це може дати сміттєзбірщику кращий натяк, щоб пам'ять була знову доступною. Будьте уважні, що будь-які речі, на які об'єкт вказує, або мають інші посилання, або спочатку скасуються, або вам дійсно доведеться чекати на сміттєзбірнику, оскільки тоді не буде ручок до них.
new
один раз, то ми мусимо використовуватиdelete
один раз. Це не вірно в PHP? Є автоматичне вивезення сміття, коли об’єкт більше не потрібен?