我遇到以下问题:
我使用具有单例模式的类,因此我将__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混淆了吗?
[编辑] 我想出了什么:
如果在定义session_start()
之后调用MySingletonClass
(因此在包含/定义包含其定义的文件之后)调用session_start()
,则会发生此错误,但如果session_start()
移动到{{1}}则不会在包含/需要任何其他文件之前,脚本执行的最开始。
有人在这里有解释吗?提前{{1}}很好,我想,无论如何我都会开始,但我想知道这里发生了什么......
答案 0 :(得分:0)
我解决了这个问题 - 问题出在我的自动加载程序中。我认为。也许
说实话,我不知道什么是真的错了,但在我取消自动加载器类并从头重新编写后,错误消息消失了所以我认为它是自动加载器错了。
你的猜测和我一样好。
答案 1 :(得分:0)
PHPUnit 5.7.27遇到了同样的问题。
在我的情况下,backupGlobals设置为“ true”。将其设置为false,在我的phpunit.xml中对其进行了修复。