【问题标题】:PHP, Is a copy of object created to be eliminated in some cases?PHP,在某些情况下是否创建了要消除的对象副本?
【发布时间】:2016-11-25 08:43:08
【问题描述】:

我怀疑 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”!,并且对象继续存在...

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

还有其他类似这种奇怪行为的奇怪案例,但现在我会

更新:在 cmets 中讨论了答案和事情之后。 如果 unset() 函数可以返回删除的结果可能会很棒。例如:'true',如果最终可以删除 var 内容或对象。

【问题讨论】:

    标签: php performance oop


    【解决方案1】:

    回答你的问题:不。

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

    来自 PHP 文档 (http://php.net/manual/en/function.unset.php)

    unset() 销毁指定的变量

    【讨论】:

    • 那么,在 make unset($object) 时内存是否被释放?
    • 所以答案是:对象(内容)直到其所有引用都被删除后才被删除?
    • 我明白了。对不起,如果这个问题是微不足道的,我在这个问题上简化了我的真实案例,对此我有疑问。哪里有对象被分配给其他对象的属性等,我在一些未设置的句子中发现了一个奇怪的情况。谢谢!
    • 我认为 PHP "decon" 页面可能会有所帮助。 GC 也有提示。 Zzz 我评论了错误的帖子,对不起。 (应该在操作)
    • 因此,重要的是要知道,在某些情况下,是否存在引用我们要消除的对象的其他变量。以确保将被完全删除等。我发现了这个。还是有其他更好的方法来了解它? detecting-whether-a-php-variable-is-a-reference-referenced
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2018-05-21
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2011-11-08
    相关资源
    最近更新 更多