У меня есть этот код для передачи тяжелых переменных среди разных классов. Цель состоит в том, что в памяти не должно быть дублирования значений, поэтому переменные передаются по ссылке вместо значения.
У меня есть этот образец здесь. Он отлично работает, за исключением одного способа. Чтобы убедиться, что значение не дублируется в памяти, я изменяю значение или удаляю значение, чтобы убедиться.
Затем я понял, что 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. Если вы пытаетесь запустить код, не скомбинируйте одну строку за раз (я знаю, что это глупый совет здесь, но все же :))
Может ли кто-нибудь сказать здесь, что происходит внутри?
unset
ting ссылка на значение удаляет ссылку на это значение, само значение и другие ссылки, указывающие на него, являются нетронутыми.