我在会话中存储对象时遇到了一点问题。根据我认为我理解的,如果类是可序列化的,并且你在调用session_start()
之前包含它,php会自动序列化/反序列化对象。
在下一个例子中(使用qcodo 0.4.22框架),我不能恢复对象的值:
require(dirname(__FILE__) . '/../includes/prepend.inc.php');
QApplication::QcodoInfo();
if (!isset($_SESSION["person"])) {
$person = Person::LoadById(1);
$_SESSION["person"]=$person;
}
else {
echo "Hello ".$_SESSION["person"]->FirstName;
}
所以,为了工作,我不得不这样做:
require(dirname(__FILE__) . '/../includes/prepend.inc.php');
QApplication::QcodoInfo();
if (!isset($_SESSION["person"])) {
$person = Person::LoadById(1);
$_SESSION["person"]=serialize($person);
}
else {
echo "Hello ".unserialize($_SESSION["person"])->FirstName;
}
对于no-qcodo类,我不需要使用序列化。是否有可能避免序列化? 感谢您提供论坛链接。你在里面放了一个非常重要的信息:
当对象在会话中,我得到错误:"脚本试图执行一个方法或访问一个不完整对象的属性。"
这意味着,在反序列化会话时,类定义还没有加载。反序列化在session_start
处完成。因此,首先加载所有类定义,然后启动会话。在这种情况下有用的是:
- 自动加载类Docs
- 定义
unserialize_callback_func
(PHP设置,参见unserialize
Docs)。每次一个未定义的类应该被实例化,它将被调用,所以你可以通过一个回调来加载类,就像Autloading(自动加载是第一位的,你可以使用这个来调试)。 - 相关:(问题的标题是误导,有趣的部分是答案:)为什么当spl_autoload_register已经使用时需要unserialize_callback_func ?
试着找出会话是在哪开始的。也许你只需要稍后启动它,PHP手册中有更多关于会话的一般信息以及如何在启动时进行配置,有一个选项可以自动启动会话,也许你会遇到这个,但这只是一个假设,还有更多的配置,我不太清楚Qcodo如何加载类。
- PHP Session Runtime Configuration Docs
- 会话介绍Docs
谢谢!听了你的评论,我离解决问题更近了一步。
查看qcodo core,我看到会话初始化的地方.....并且是在包含类之前完成的。
问题是类在我调用它的那一刻就被包含了(这怎么可能?)我在类文件中编写了一个回显句,并且该回显出现在我使用类的那一刻。对于这个,我不知道什么时候调用session_start()来解决这个问题。
编辑:我发现了php的"自动加载"功能。那不是吗?所以我的问题是,是否有可能保持自动加载并在正确的时刻开始会话 我终于找到了解决办法。在qcodo论坛上给我建议了几个选择。最后,我必须在qcodo调用session_start函数之前包含数据类。谢谢大家