我试图理解PHP如何处理引擎盖下的对象。 所以我运行了这个小测试脚本 这基本上是
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如何处理内存中的对象,将对象传递给变量或函数时会发生什么?
注意:
我知道对象克隆/破坏,我的问题不是如何克隆或复制问题,它是关于如何在代码中移动对象,它在哪里生活,以及我在实际分配什么时我将对象分配给变量?
谢谢:)
答案 0 :(得分:1)
$a
和this->repository[0]
都是指向同一对象的指针。通过两个引用都可以看到更改对象的内容。但重新分配任一变量会更改该变量引用的内容,但不会更改它过去指向的对象。
答案 1 :(得分:0)
正如Barmar所说,他们指向同一个对象。我的理解是,当所有指向该对象的指针($a
和this->repository[0]
)都被销毁(设置为null,超出范围,显式取消设置)时,该对象将不再可访问 - 内部对象指针计数器将为0.当php清理发生时,对象的内存将(希望)被释放。但是,我并不了解内部情况 - 这只是来自我已经完成的测试 - 与您的类似,并且跟踪内存使用情况。