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

Php 销毁主对象时销毁嵌入的对象,php,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 $v

我想销毁一个对象和其中的实习生对象。以下示例不起作用的原因:

<?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);
为什么我没有得到通知
未定义变量:I
? 在$I的var_转储之后,类I的析构函数的消息是如何显示的

更新


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

让我们来谈谈四行代码:

$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
类型的对象

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

来自PHP文档:

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


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

注意,不必删除嵌套对象。在脚本结束时,对象将被自动删除。实际上我必须这样做,因为我的主对象在循环中使用,我必须清除所有嵌套对象。清除嵌套对象后,是否仍要使用主对象?此外,如果要刷新嵌套对象,则不应使用析构函数,因为它将杀死主对象。不能刷新已终止对象的嵌套对象。实际上,不应该将我的主对象销毁到循环中(但在之后)。在循环中,我需要使用当前迭代的新值刷新嵌套对象。我举的例子并不完美@axiac似乎做了我想做的事。听起来很完美。所以你建议我保持类A的析构函数不变。你不需要类A的析构函数。有或没有它,当
A
类型的对象被销毁时,它们对
I
类型的对象的引用仍然会被删除。在这种情况下,保留或删除它只是个人喜好的问题。您可以保留这些对象以进行调试,并在确定对象已在您希望销毁时销毁时删除它们,并且不迟于此。
$i = new I();
$a = new A($i);
unset($a);
var_dump($i);