在销毁主对象时销毁嵌入的对象

时间:2014-12-02 10:56:52

标签: php

我想破坏一个物体和它里面的实习生物体。为什么以下示例不起作用:

<?php
class I
{
    public $elt = 'hello world!!';
    public function __destruct()
    {
        var_dump('I: destroyed');
    }
}

class A
{
    public $val1=1;
    public $val2=2;
    public $val3=3;
    public $val4=4;
    public $i;
    public function __construct($i)
    {
        $this->i = $i;
    }
    public function __destruct()
    {
        var_dump('A destroyed');
        unset($this->i);
    }
}

$i = new I();
$a = new A($i);
unset($a);
var_dump($i);

输出:

  string(11) "A destroyed"
  object(I)#1 (1) { ["elt"]=> string(13) "hello world!!" }
  string(12) "I: destroyed"

为什么我没有得到通知Undefined variable: i? 为什么在$ i的var_dump之后显示类I的析构函数的消息?

更新

问题是我有一个主对象,这个对象必须在循环的每次迭代结束时清除/刷新它的嵌套对象。

2 个答案:

答案 0 :(得分:2)

我们来谈谈四行代码:

$i = new I();
$a = new A($i);
unset($a);
var_dump($i);

第一行创建一个I类型的对象,并在变量$i中存储对它的引用(PHP对象总是被指定为引用,你需要使用运算符clone来创建一个副本)。

第二行将$i传递给类A的构造函数,并创建另一个对同一对象的引用,存储在$a->$i中。

第三行销毁A类型的对象;这将删除对I类型对象的第二个引用,但它不会影响第一个引用;变量$i仍然保留它。

第四行转储从未取消设置的变量$i的内容。它是在第一行创建的I类型的对象。

如果要在类型I的对象被销毁时销毁A类型的对象,请确保没有其他引用。这可以通过在类I的构造函数中创建类型A的对象,或者在将$i传递给类{{1}的构造函数后删除对A的所有引用来实现。 }}。在unset($i);之后添加$a = new A($i);即可完成任务。

答案 1 :(得分:1)

从PHP文档:http://php.net/manual/en/language.oop5.decon.php

  

在脚本关闭期间调用的析构函数具有HTTP标头   已经发送。脚本关闭阶段的工作目录可以   与某些SAPI(例如Apache)不同。

执行其他调用后,将调用销毁方法。这意味着首先调用var_dump($ i),然后执行析构。