__destruct如何处理$ _SESSION中的对象

时间:2012-06-22 17:48:17

标签: php oop session

如果PHP中的对象存储在会话$_SESSION中,何时调用__destruct方法?我在手册中找不到任何明确的答案。它确实会在脚本执行结束时自动调用__destruct,因此我的期望是,无论$_SESSION中是否存在它都会被调用。

这是否意味着会话中对象的每个请求都会调用潜在的__destruct

: 是__destruct之前还是之后序列化对象? __destruct中的修改是否会反映在下一个请求中?

2 个答案:

答案 0 :(得分:3)

您实际上并未将对象存储在会话中,而是将其序列化为字符串。然后,您可以覆盖对象上的魔术__sleep__wakeup方法。在序列化对象时调用__sleep,并在尝试反序列化对象时调用__wakeup

有关详细信息,请参阅:

Manual Documentation for __sleep and __wakeup

Manual Documentation for Storing Serialized Objects in Session

答案 1 :(得分:0)

每次使用该对象的实例运行脚本时,都会调用

__construct__destruct。如果将对象放在会话中,则该对象在页面视图中不具有相同的值,它只是一个对象。我写了一个简单的例子来证明这一点:

class MyClass{
    var $myVar=1;
    function __construct(){
        $this->myVar++;
    }
    function __destruct(){
        echo "destruct";
    }
}
session_start();
$_SESSION['object']=new MyClass;
echo $_SESSION['object']->myVar;

这个输出是:

  

destruct2destruct

这部分引发了我一个小循环,我希望有人在那里可以纠正我,如果我错了。 __destruct()被调用两次,因为该对象被创建,然后在将其放入会话时被销毁。回应$_SESSION['object']->myVar重新启动对象,然后销毁。

如果您修改代码并取出$_SESSION['object']=new MyClass;并重新运行脚本,它将生成:

  

2destruct

同样,对象在调用对象时被销毁,函数完成执行。基本上,如果将对象存储在会话中,则每次访问对象时都会被销毁。