php如何处理内存中的对象

时间:2014-03-20 02:32:23

标签: php oop object

我试图理解PHP如何处理引擎盖下的对象。 所以我运行了这个小测试脚本 这基本上是

  1. 创建一个新对象
  2. 将其保存到数组中
  3. 返回数组元素 - 包含要保存在其他变量中的对象。
  4. 操纵对象并查看变量和数组对象是否相同。

  5. class a
    {
        public $a=0;
    }
    class factory
    {
        public $repository=[];
    
        function make($name){
            $this->repository[]= new $name;
            return end($this->repository);
        }
    }
    
    $f = new factory;
    $a = $f->make('a'); //a Object([a]=>0);
    
    $a->a = 6;
    print_r($f->repository);  //a Object([a] => 6)
    print_r($a);        //a Object([a] => 6)
    
    $f->repository[0]->a = 9;
    
    print_r($f->repository);  //a Object([a] => 9)
    print_r($a);        //a Object([a] => 9) !
    
    $f->repository[0] = null;
    print_r($a);        //a Object([a] => 9) still. SO WHERE DOES THE OBJECT LIVES ?
    

    结果是$a$this->repository[0]都保持同步,$ a状态的任何变化都反映在存储库数组元素上,反之亦然。

    然而,如果我取消设置$ this-> repository [0] $ a不受影响(尽管repo数组是首先创建该对象的源)。

    我觉得我错过了这里的基础知识,所以有人可以详细说明php如何处理内存中的对象,将对象传递给变量或函数时会发生什么?

    注意:

    我知道对象克隆/破坏,我的问题不是如何克隆或复制问题,它是关于如何在代码中移动对象,它在哪里生活,以及我在实际分配什么时我将对象分配给变量?

    谢谢:)

2 个答案:

答案 0 :(得分:1)

$athis->repository[0]都是指向同一对象的指针。通过两个引用都可以看到更改对象的内容。但重新分配任一变量会更改该变量引用的内容,但不会更改它过去指向的对象。

答案 1 :(得分:0)

正如Barmar所说,他们指向同一个对象。我的理解是,当所有指向该对象的指针($athis->repository[0])都被销毁(设置为null,超出范围,显式取消设置)时,该对象将不再可访问 - 内部对象指针计数器将为0.当php清理发生时,对象的内存将(希望)被释放。但是,我并不了解内部情况 - 这只是来自我已经完成的测试 - 与您的类似,并且跟踪内存使用情况。