试图避免使用qcodo在PHP中进行序列化

时间:2011-09-14 13:05:11

标签: php serialization qcodo

在会话中存储对象时遇到一些问题。根据我的理解,如果该类是可序列化的并且在调用session_start()之前包含它,则php会自动序列化/反序列化该对象。

在下一个示例中(使用qcodo 0.4.22 framework)我无法恢复对象的值:

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类我不需要使用序列化。 是否可以避免序列化?

2 个答案:

答案 0 :(得分:1)

感谢providing the link to the forums。你在那里写了一个非常重要的信息:

  

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

这意味着,在反序列化会话时,尚未加载类定义。反序列化在session_start完成。因此,首先加载所有类定义,然后启动会话。在这方面有帮助的是:

因此,请尝试找出会话开始之类的内容。也许你只需要稍后启动它,PHP手册有更多关于会话的信息以及如何配置启动时,有一个自动启动会话的选项,也许你正在遇到这个,但这只是一个假设,还有更多的配置,我不会流利Qcodo如何加载类。

答案 1 :(得分:0)

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

查看qcodo核心,我看到会话初始化的地方.....并且在包括类之前完成。

问题是,在我打电话的那一刻,这个班级被包括在内(怎么可能?)。我在类文件中写了一个echo语句,并且在我使用该类的那一刻出现了echo。为此,我不知道何时调用session_start()来解决问题。

编辑:我在php中发现了“自动加载”功能。那是不是?所以我的问题是,是否可以保留自动加载并在适当的时刻开始会话

EDIT2:我终于找到了解决方案。在qcodo论坛上我提出了几个选择。最后,我必须在qcodo调用session_start函数之前包含数据类。感谢每个人