почему UNSET и NULL работают по-разному

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

У меня есть этот образец здесь. Он отлично работает, за исключением одного способа. Чтобы убедиться, что значение не дублируется в памяти, я изменяю значение или удаляю значение, чтобы убедиться.

Затем я понял, что UNSETing переменной имеет другой эффект и делает его NULL имеет другой эффект.

Если я UNSET исходную переменную, то все же я получаю значение из ссылочной переменной. Если я сделаю исходную переменную как NULL, она ничего не вернет.

Вот код:

<?php class a { private $req; public function store_request(&$value) { $this->req = &$value; } public function get_request() { return $this->req; } } class b { private $json; private $obj; public function init_req(&$request) { $this->obj = new a; $this->obj->store_request($request); } public function get_req() { return $this->obj->get_request(); } } $locvar = 'i am here'; $b = new b; $b->init_req($locvar); $locvar = 'now here'; ## This will not result empty echo from 'echo $b->get_req();' //unset($locvar); ## This will result in empty echo from 'echo $b->get_req();' //$locvar = null; echo $b->get_req(); ?> 

Пронумерованы строки UNSET и NULL. Если вы пытаетесь запустить код, не скомбинируйте одну строку за раз (я знаю, что это глупый совет здесь, но все же :))

Может ли кто-нибудь сказать здесь, что происходит внутри?

  1. unset ting ссылка на значение удаляет ссылку на это значение, само значение и другие ссылки, указывающие на него, являются нетронутыми.
  2. Присвоение чего-то ссылке заменяет значение, на которое ссылается ссылка, и, следовательно, значение всех других ссылок, которые указывают на него.
  3. Вам не нужно микроуровневать память в PHP. PHP не будет копировать значение в памяти при передаче значений. Он использует стратегию копирования на запись, которая только выделяет новую память, когда это абсолютно необходимо. Ссылки на PHP – это логическая операция для создания определенного поведения, это не инструменты управления памятью или C-указатели.