2016-07-21 37 views
0

我对PHP对象在某些情况下被删除之后的行为表示怀疑,做了一些测试。是代码:PHP,是在某些情况下创建的对象的副本?

class ItemRecord 
{ 
    private $id; 
    protected $name; 

    public function __contruct($pID, $pName) 
    { 
     $this->id = $pID; 
     $this->name = $pName; 
    } 
    public function setName($pName) 
    { 
     $this->name = $pName; 
    } 
    public function getName() 
    { 
     return $this->name; 
    } 
} 

我创建ItemRecord类的一些对象,然后,把它们添加到对象列表(数组):

$objList = array(); 

$obj1 = new ItemRecord("1", "Object 1"); 
$objList[] = $obj1; 
$obj2 = new ItemRecord("2", "Object 2"); 
$objList[] = $obj2; 

如果我更改了“原始”某些属性对象,例如:

$obj1->setName("FOO"); 

然后我会尽力展现“关联性”元素的列表与原始对象的内容:

echo($objList[0]->getName()); //-> Of course, It displays "FOO" 

所以,如果我删除的对象不应该在名单存在了

unset($obj1); unset($obj2); 

但它不是这样的!

echo($objList[0]->getName()); 

它继续显示“FOO”!和对象继续使用现有,以及...

所以我的问题是:在这种情况下,当你删除一个对象,复制操作发生在删除时间?

还有其他好奇的情况下,像这种奇怪的行为,但现在我会

更新:的答案,之后的事情已经在注释中谈到。如果unset()函数可能返回删除结果,那么它可能会很好。例如:'true',如果var内容或对象可以最终删除。

回答

2

回答您的问题:

当您取消设置值时,您只是删除对该变量的引用,实际上并未删除该值。当没有对该变量的引用时,它将被删除。

从PHP文档(http://php.net/manual/en/function.unset.php

未设置()销毁指定的变量

+0

所以,当释放的内存进行复位($对象)? – MikeBau

+0

没有。取消设置将删除对该$对象的引用。 – user3091574

+0

所以答案是:**对象(内容)不会被删除,直到所有的引用被删除?** – MikeBau

相关问题