摧毁主要对象时销毁嵌入对象
问题描述:
我想摧毁一个对象和实习对象。为什么下面的例子不工作:摧毁主要对象时销毁嵌入对象
<?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);
OUTPUT:
string(11) "A destroyed"
object(I)#1 (1) { ["elt"]=> string(13) "hello world!!" }
string(12) "I: destroyed"
为什么我没有得到通知Undefined variable: i
? 在$ i的var_dump之后,如何显示类I的析构函数的消息?
UPDATE
的事情是,我有一个主对象,这个对象有吹扫/在循环的每次迭代结束刷新其嵌套的对象。
答
讲起了四行代码:
$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
的对象时,请确保没有其他引用。这可以通过在A
类的构造函数中创建类型为I
的对象或在将其传递给类A
的构造函数后,将所有对$i
的引用删除来完成。在$a = new A($i);
之后添加unset($i);
就可以完成这项工作。
答
从PHP文件:http://php.net/manual/en/language.oop5.decon.php
析构函数在脚本关闭时调用有HTTP标头 已经发出。脚本关闭阶段中的工作目录 可能与某些SAPI(例如Apache)不同。
销毁方法将在执行完其他调用后调用。意思是你的var_dump($ i)会先被调用,然后执行破坏。
请注意,删除嵌套对象并不是必需的。在脚本结尾处,对象将被自动删除。 – 2014-12-02 11:05:54
其实我必须这样做,因为我的主要对象是在一个循环内部使用的,而且我需要清除所有嵌套的对象 – smarber 2014-12-02 11:08:48
而且在清除嵌套对象之后是否还想使用主对象? – 2014-12-02 11:11:12