首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >销毁主对象时销毁嵌入的对象

销毁主对象时销毁嵌入的对象
EN

Stack Overflow用户
提问于 2014-12-02 10:56:51
回答 2查看 46关注 0票数 1

我想毁掉一个物体和里面的实习对象。为什么下面的示例不起作用:

代码语言:javascript
复制
<?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);

产出:

代码语言:javascript
复制
  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类析构函数的消息?

更新

问题是,我有一个主对象,这个对象必须在循环的每次迭代结束时清除/刷新它的嵌套对象。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-02 11:05:06

让我们谈谈这四行代码:

代码语言:javascript
复制
$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);将完成这项工作。

票数 2
EN

Stack Overflow用户

发布于 2014-12-02 11:08:49

来自PHP文档:http://php.net/manual/en/language.oop5.decon.php

在脚本关闭期间调用的析构函数已经发送了HTTP报头。脚本关闭阶段的工作目录可能与某些SAPI(例如Apache)不同。

销毁方法将在其他调用完成后调用。这意味着首先调用var_dump($i),然后执行析构操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27247681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档