繁体   English   中英

为什么当我 session_start() 时在我的对象上调用 __wakeup()?

[英]Why is __wakeup() called on my object when I session_start()?

我有以下问题:

我使用了一个带有单例模式的类,因此我将 __wakeup() 设为私有。 该对象绝不会存储在会话中。 当我调用 session_start() 时,我收到此错误消息:

Warning: Invalid callback MySingletonClass::__wakeup, cannot access private method MySingletonClass::__wakeup() in Session.php on line 32

Session.php 的第 32 行内容如下:

30 public function startSession() {
31     if (session_status() == PHP_SESSION_NONE) {
32         session_start();
33     }
34 }

我知道存储在会话中的对象正在被序列化和反序列化,但 MySingletonClass 从未存储在会话中......实际上,$_SESSION 数组是空的。

我在想,也许我在某个时候不小心将它存储在会话中并且它就在那里,但是即使我清除了所有 $_SESSION 数据,销毁会话,删除服务器上的会话文件,重新启动 Apache 并启动新会话,这种情况仍然存在...

更奇怪的是,我使用了几个不同的类,它们使用完全相同的单例模式,具有私有的 __wakeup(),并且它们从不提出这个问题。 它只是这个。

到底是怎么回事? 我的代码是不是太疯狂了 php 被搞糊涂了?

[编辑] 我想出了一些事情:

如果在定义MySingletonClass之后调用session_start()会发生此错误(因此在包含/需要包含其定义的文件之后),但如果session_start()移动到脚本执行的最开始,在任何其他文件之前,则不会发生此错误包括/需要。

有人在这里有解释吗? session_start()早点是好的,我想,无论如何我都会启动它,但我想知道这里发生了什么......

我解决了这个问题 - 问题出在我的自动加载程序中。 我认为。 也许。

老实说,我不知道到底出了什么问题,但是在我取消了自动加载器类并从头开始重新编写之后,错误消息消失了,所以我认为是自动加载器出了问题。

你的猜测和我的一样好。

刚刚有同样的问题,PHPUnit 5.7.27。

就我而言,backupGlobals 设置为“true”。 在我的 phpunit.xml 中将它设置为 false,修复它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM