我想破坏一个物体和它里面的实习生物体。为什么以下示例不起作用:
<?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的析构函数的消息?
更新
问题是我有一个主对象,这个对象必须在循环的每次迭代结束时清除/刷新它的嵌套对象。
答案 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),然后执行析构。