为什么在session_start()时调用__wakeup()?

时间:2017-10-12 11:51:00

标签: php session singleton

我遇到以下问题:

我使用具有单例模式的类,因此我将__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}}很好,我想,无论如何我都会开始,但我想知道这里发生了什么......

2 个答案:

答案 0 :(得分:0)

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

说实话,我不知道什么是真的错了,但在我取消自动加载器类并从头重新编写后,错误消息消失了所以我认为它是自动加载器错了。

你的猜测和我一样好。

答案 1 :(得分:0)

PHPUnit 5.7.27遇到了同样的问题。

在我的情况下,backupGlobals设置为“ true”。将其设置为false,在我的phpunit.xml中对其进行了修复。