如果PHP中的对象存储在会话$_SESSION
中,何时调用__destruct
方法?我在手册中找不到任何明确的答案。它确实会在脚本执行结束时自动调用__destruct
,因此我的期望是,无论$_SESSION
中是否存在它都会被调用。
这是否意味着会话中对象的每个请求都会调用潜在的__destruct
?
加:
是__destruct
之前还是之后序列化对象? __destruct
中的修改是否会反映在下一个请求中?
答案 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
同样,对象在调用对象时被销毁,函数完成执行。基本上,如果将对象存储在会话中,则每次访问对象时都会被销毁。