разница между unset и = null

Из случайного сообщения php.net :

Если вы делаете $ any = null; то вы переписываете данные переменной. Вы могли бы освободить память / сократиться быстрее, но она может украсть циклы процессора из кода, который действительно нуждается в них раньше, что приведет к более длительному общему времени выполнения.

По-видимому, это бесспорная истина, поэтому, возможно, кто-то будет так любезен объяснить.

Я имею в виду, что, делает unset волшебным образом не выполнение каких-либо команд сборки, тогда как $whatever = null; делает? Ответ, как указано, примерно так же полезен, как сказать

$ whatever = null сбрасывает буфер и кеш L1, тогда как unset очищает буфер и сбрасывает кеш L2.

Techno mumbo jumbo не является ответом.

Важным отличием обоих методов является то, что unset($a) также удаляет $a из таблицы символов; например:

 $a = str_repeat('hello world ', 100); unset($a); var_dump($a); с $a = str_repeat('hello world ', 100); unset($a); var_dump($a); 

Выходы:

 Notice: Undefined variable: a in xxx NULL 

Но когда используется $a = null :

 $a = str_repeat('hello world ', 100); $a = null; var_dump($a); 

Выходы:

 NULL 

Я также запускал код с помощью теста и обнаружил, что $a = null примерно на 6% быстрее, чем его unset() . Кажется, что обновление записи таблицы символов происходит быстрее, чем удаление.

добавление

Другая разница (как видно из этого маленького скрипта), по-видимому, заключается в том, сколько памяти восстанавливается после каждого вызова:

 echo memory_get_usage(), PHP_EOL; $a = str_repeat('hello world ', 100); echo memory_get_usage(), PHP_EOL; // EITHER unset($a); OR $a = null; echo memory_get_usage(), PHP_EOL; 

При использовании unset() возвращается все, кроме 64 байт памяти, тогда как $a = null; освобождает все, кроме 272 байта памяти. У меня недостаточно знаний, чтобы знать, почему существует разница в 208 байтов между обоими методами, но это тем не менее.

При использовании unset, использование памяти и время обработки меньше.

http://php.net/manual/en/function.unset.php#105980

Я сделал простой тест.

Учитывая простой класс:

 class Cat{ public $eyes = 2; public $claws = 4; public $name = "Kitty"; public $sound = ['Meow', 'Miaou']; } 

Я запустил этот код

 $start = microtime(true); for($i = 10000000; $i > 0; --$i){ $cat = new Cat; $cat = null; } $end = microtime(true); printf("Run in %s and use %s memory", round($end - $start, 2), round(memory_get_usage() / 1000, 2)); 

Запуск в 1.95 и использование 233.29 памяти

И это

 for($i = 10000000; $i > 0; --$i){ $cat = new Cat; unset($cat); } с for($i = 10000000; $i > 0; --$i){ $cat = new Cat; unset($cat); } 

Запуск в 2.28 и использование 233.1 памяти

Для того, что стоит, кажется, null метод работает быстрее.

Использование кода

 $a = str_repeat('hello world ', 10000); $start1 = microtime(true); unset($a); $stop1 = microtime(true); $a = str_repeat('hello world ', 10000); $start2 = microtime(true); $a = null; $stop2 = microtime(true); echo 'unset time lap of '. ( $stop1 - $start1 ) .'<br>'; echo 'null time lap of '. ( $stop2 - $start2 ) .'<br>'; с $a = str_repeat('hello world ', 10000); $start1 = microtime(true); unset($a); $stop1 = microtime(true); $a = str_repeat('hello world ', 10000); $start2 = microtime(true); $a = null; $stop2 = microtime(true); echo 'unset time lap of '. ( $stop1 - $start1 ) .'<br>'; echo 'null time lap of '. ( $stop2 - $start2 ) .'<br>'; 

в 10 раз:

 unset time lap of 5.0067901611328E-6 null time lap of 1.1920928955078E-6 unset time lap of 9.5367431640625E-7 null time lap of 9.5367431640625E-7 unset time lap of 0 null time lap of 9.5367431640625E-7 unset time lap of 2.1457672119141E-6 null time lap of 1.1920928955078E-6 unset time lap of 2.1457672119141E-6 null time lap of 0 unset time lap of 9.5367431640625E-7 null time lap of 0 unset time lap of 1.9073486328125E-6 null time lap of 9.5367431640625E-7 unset time lap of 9.5367431640625E-7 null time lap of 0 unset time lap of 1.9073486328125E-6 null time lap of 9.5367431640625E-7 unset time lap of 0 null time lap of 0 

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