我想毁掉一个物体和里面的实习对象。为什么下面的示例不起作用:
<?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?为什么在我的var_dump of $i之后显示I类析构函数的消息?
更新
问题是,我有一个主对象,这个对象必须在循环的每次迭代结束时清除/刷新它的嵌套对象。
发布于 2014-12-02 11:05:06
让我们谈谈这四行代码:
$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类型的对象,或者在传递给类A的构造函数之后删除对$i的所有引用来实现。在unset($i);之后添加$a = new A($i);将完成这项工作。
发布于 2014-12-02 11:08:49
来自PHP文档:http://php.net/manual/en/language.oop5.decon.php
在脚本关闭期间调用的析构函数已经发送了HTTP报头。脚本关闭阶段的工作目录可能与某些SAPI(例如Apache)不同。
销毁方法将在其他调用完成后调用。这意味着首先调用var_dump($i),然后执行析构操作。
https://stackoverflow.com/questions/27247681
复制相似问题