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);