3

如果PHP中的一个对象存储在会话中,什么时候会调用$_SESSION它的方法?__destruct我无法在手册中找到任何明确的答案。它确实说__destruct将在脚本执行结束时自动调用,所以我的期望是无论它是否存在于$_SESSION.

那么这是否意味着__destruct在会话中对对象的每个请求都可能会调用它?

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

4

2 回答 2

3

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

有关详细信息,请参阅:

__sleep 和 __wakeup 的手动文档

在会话中存储序列化对象的手动文档

于 2012-06-22T18:02:38.650 回答
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;

这个的输出是:

破坏2破坏

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

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

2破坏

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

于 2012-06-22T18:04:46.040 回答