摧毁主要对象时销毁嵌入对象

问题描述:

我想摧毁一个对象和实习对象。为什么下面的例子不工作:摧毁主要对象时销毁嵌入对象

<?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

的事情是,我有一个主对象,这个对象有吹扫/在循环的每次迭代结束刷新其嵌套的对象。

+0

请注意,删除嵌套对象并不是必需的。在脚本结尾处,对象将被自动删除。 – 2014-12-02 11:05:54

+0

其实我必须这样做,因为我的主要对象是在一个循环内部使用的,而且我需要清除所有嵌套的对象 – smarber 2014-12-02 11:08:48

+0

而且在清除嵌套对象之后是否还想使用主对象? – 2014-12-02 11:11:12

讲起了四行代码:

$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);就可以完成这项工作。

+0

听起来很完美。所以你建议我保留A类的析构函数。 – smarber 2014-12-02 11:17:00

+1

你并不需要类A的析构函数。有或没有它时,当'A'类型的对象被破坏时,它们对'I'类型对象的引用无论如何都被移除。在这种情况下保留或删除它只是个人喜好的问题。您可以保留它们以进行调试,并在确定对象被销毁并且不迟于此时销毁它们时将其移除。 – axiac 2014-12-02 11:40:46

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

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

销毁方法将在执行完其他调用后调用。意思是你的var_dump($ i)会先被调用,然后执行破坏。