为什么UNSET和NULL以不同的方式工作

时间:2012-05-18 06:30:47

标签: php

我有这个代码在不同的类之间传递重变量。目标是在内存中不应该有任何重复值,因此变量通过referance而不是value传递。

我这里有这个样本。它在某种程度上工作正常。只是为了确保内存中的值不重复,我修改值或删除值以确保。

然后我认为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 个答案:

答案 0 :(得分:3)

  1. unset对值的引用会删除对该值的引用,值本身以及指向它的其他引用都不会受到影响。
  2. 为引用分配内容会覆盖引用所指向的值,从而覆盖指向它的所有其他引用的值。
  3. 您不需要在PHP中对内存进行微观管理。传递值时,PHP将 复制内存中的值。它使用写时复制策略,只在绝对必要时才分配新内存。 PHP中的引用是用于产生某些行为的逻辑操作,它们不是内存管理工具或C指针。