Из случайного сообщения 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, использование памяти и время обработки меньше.
Я сделал простой тест.
Учитывая простой класс:
 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 
Похоже, что нулевое присвоение имеет меньшее время обработки.