0

在会话中存储对象时我遇到了一些问题。根据我的理解,如果该类是可序列化的并且您在调用之前将其包含在内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 类,我不需要使用序列化。是否可以避免序列化?

4

2 回答 2

1

感谢您提供论坛的链接。你在那里放了一个非常重要的信息:

当对象在会话中时,我收到错误消息:“脚本试图执行方法或访问不完整对象的属性。”</p>

这意味着,在反序列化会话时,尚未加载类定义。反序列化在session_start. 所以首先加载所有类定义,然后启动会话。在这种情况下有帮助的是:

所以试着找出会话开始的地方。也许你只需要稍后再启动它,PHP 手册有更多关于会话的一般信息以及如何配置它何时启动,有一个自动启动会话的选项,也许你遇到了,但这只是一个假设,还有更多的配置,我不熟悉 Qcodo 如何加载类。

于 2011-09-15T12:19:25.007 回答
0

谢谢!。我更接近您的评论的解决方案。

查看 qcodo 核心,我看到了会话被初始化的地方.....它是在包含类之前完成的。

问题是该类包含在我调用它的那一刻(这怎么可能?)。我在类文件中写了一个回声语句,并且那个回声出现在我使用该类的那一刻。为此,我不知道何时调用 session_start() 来解决问题。

编辑:我在 php.ini 中发现了“自动加载”功能。是不是为了那个?所以我的问题是是否可以保持自动加载并在正确的时刻开始会话

EDIT2:我终于找到了解决方案。在 qcodo 论坛中向我建议了几个选项。最后,我必须在 qcodo 调用 session_start 函数之前包含数据类。谢谢大家

于 2011-09-15T12:47:39.553 回答