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

  • 本文关键字:方式 工作 NULL UNSET php
  • 更新时间 :
  • 英文 :


我有这段代码在不同的类之间传递繁重的变量。目标是内存中不应有任何重复的值,因此变量是通过引用而不是按值传递的。

我这里有这个样本。除了一种方式外,它工作正常。只是为了确保该值不会在内存中重复,我修改该值或删除该值以确保。

然后我认为取消设置变量有不同的效果,使其为 NULL 有不同的效果。

如果我取消设置原始变量,那么我仍然从引用的变量中获取值。如果我将原始变量设为 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();



?>

未设置和空行被注释。如果您尝试一次运行一行代码(我知道这是愚蠢的建议,但仍然:)(

谁能在这里告诉内部发生了什么??

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

最新更新