简体   繁体   English

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

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

I have a following problem:我有以下问题:

I use a class with singleton pattern, i made the __wakeup() private for that reason.我使用了一个带有单例模式的类,因此我将 __wakeup() 设为私有。 At no point is that object being stored in session.该对象绝不会存储在会话中。 When i call session_start(), i get this error message:当我调用 session_start() 时,我收到此错误消息:

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

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

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

I understand that objects stored in session are being serialized and unserialized, but MySingletonClass is never stored in session... In fact, the $_SESSION array is empty.我知道存储在会话中的对象正在被序列化和反序列化,但 MySingletonClass 从未存储在会话中......实际上,$_SESSION 数组是空的。

I was thinking that maybe i stored it in session by accident sometime and it sits there, but this persists even if i clear all $_SESSION data, destroy the session, delete session files on server, restart Apache and start new session...我在想,也许我在某个时候不小心将它存储在会话中并且它就在那里,但是即使我清除了所有 $_SESSION 数据,销毁会话,删除服务器上的会话文件,重新启动 Apache 并启动新会话,这种情况仍然存在...

What's even weirder is that i use several different classes that use exact same singleton pattern, have private __wakeup(), and they never raise this problem.更奇怪的是,我使用了几个不同的类,它们使用完全相同的单例模式,具有私有的 __wakeup(),并且它们从不提出这个问题。 Its just this one.它只是这个。

What is going on?到底是怎么回事? Is my code so insane php got confused?我的代码是不是太疯狂了 php 被搞糊涂了?

[edit] I figured something out: [编辑] 我想出了一些事情:

This error happens if session_start() is called AFTER the MySingletonClass has been defined (so after the file containing its definition has been included/required) but does not if session_start() is moved to the very beginning of script execution, before any other files are included/required.如果在定义MySingletonClass之后调用session_start()会发生此错误(因此在包含/需要包含其定义的文件之后),但如果session_start()移动到脚本执行的最开始,在任何其他文件之前,则不会发生此错误包括/需要。

Does anyone have an explanation here?有人在这里有解释吗? Having session_start() earlier is fine I guess, I would start it anyhow, but I would like to know what is happening here...session_start()早点是好的,我想,无论如何我都会启动它,但我想知道这里发生了什么......

I resolved the issue - the problem was in my autoloading procedure.我解决了这个问题 - 问题出在我的自动加载程序中。 I think.我认为。 Perhaps.也许。

To be honest, i have no clue what was really wrong, but after i scrapped my autoloader class, and re-wrote it from scratch, the error message disappeared so i assume it was autoloader that was at fault.老实说,我不知道到底出了什么问题,但是在我取消了自动加载器类并从头开始重新编写之后,错误消息消失了,所以我认为是自动加载器出了问题。

Your guess is as good as mine.你的猜测和我的一样好。

Just had the same problem, with PHPUnit 5.7.27.刚刚有同样的问题,PHPUnit 5.7.27。

In my case, backupGlobals was set to "true".就我而言,backupGlobals 设置为“true”。 Setting it to false, in my phpunit.xml, fixed it.在我的 phpunit.xml 中将它设置为 false,修复它。

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

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