如果PHP中的一个对象存储在会话中,什么时候会调用$_SESSION
它的方法?__destruct
我无法在手册中找到任何明确的答案。它确实说__destruct
将在脚本执行结束时自动调用,所以我的期望是无论它是否存在于$_SESSION
.
那么这是否意味着__destruct
在会话中对对象的每个请求都可能会调用它?
补充:对象会在序列化之前还是之后__destruct
?中的修改__destruct
会反映在下一个请求中吗?
您实际上并没有将对象存储在会话中,而是将其序列化为字符串。然后,您可以覆盖对象上的魔法__sleep
和__wakeup
方法。__sleep
在对象被序列化__wakeup
时被调用,并且在您尝试反序列化对象时被调用。
有关详细信息,请参阅:
__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破坏
同样,当对象被调用时,对象被销毁,函数完成执行。基本上,如果您将对象存储在会话中,预计每次访问该对象时它都会被销毁。