尝试使用qcodo在php中避免序列化

尝试使用qcodo在php中避免序列化,php,serialization,qcodo,Php,Serialization,Qcodo,在会话中存储对象时,我遇到了一些小问题。据我所知,如果类是可序列化的,并且在调用session_start()之前包含它,php会自动序列化/取消序列化对象 在下一个示例(使用)中,我无法恢复对象的值: require(dirname(__FILE__) . '/../includes/prepend.inc.php'); QApplication::QcodoInfo(); if (!isset($_SESSION["person"])) { $person = Person::Lo

在会话中存储对象时,我遇到了一些小问题。据我所知,如果类是可序列化的,并且在调用
session_start()
之前包含它,php会自动序列化/取消序列化对象

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

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;
}
由于没有qcodo类,我不需要使用序列化。 可以避免序列化吗?

谢谢。你在里面放了一个非常重要的信息:

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

这意味着,在取消序列化会话时,尚未加载类定义。非串行化在
会话\u开始时执行
。因此,首先加载所有类定义,然后启动会话。在这方面有帮助的有:

  • 定义
    unserialize\u callback\u func
    (PHP设置,请参阅)。每次应该实例化一个未定义的类时,都会调用它,因此您可以通过回调加载这些类,就像自动加载一样(自动加载是第一位的,但是您可以使用这个进行调试)
  • 相关:(问题的标题有误导性,有趣的部分是答案:)
所以,试着找出像这样的会话是从哪一个开始的。也许您只需要稍后启动,PHP手册中有更多关于会话的信息,以及如何在启动时进行配置,有一个自动启动会话的选项,也许您遇到了这个问题,但这只是一个假设,还有更多的内容需要配置,我不清楚Qcodo如何加载类


    • 谢谢!。通过您的评论,我更接近解决方案

      查看qcodo核心,我看到了会话初始化的位置。。。。。这是在包含类之前完成的

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

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


      我终于找到了解决办法。在qcodo论坛上,我提出了几个选择。最后,我必须在qcodo调用session_start函数之前包含数据类。Thx to everyone

      哪个类是
      Person
      ?它是一个“表类”,取自Qcodo站点中的示例数据库。我只想说明在会话中存储对象而不序列化是不可能的。这个表类是否有一个具体的名称?也许有什么可以查到的?我只是想了解具体情况。我已经很清楚,在将具体实例存储到会话中时,您在处理该实例时遇到了问题。表和类的名称都是Person。所有qcodo表类的问题都是一样的。这是数据库脚本的链接:奇怪的是,对于以前版本的qcodo,我没有这个问题。默认情况下,会话序列化了所有的值,正如您所写的。这是由PHP本身实现的。只要Qcodo不重写此行为,它就可以工作。我正在研究Qcodo代码来定位Person类,但在查找所有类时遇到了问题,尤其是Person本身。对于我能够找到的类(QCodeGenBase*;*QCodeGen),我也找不到任何与serialize相关的内容。但这并不意味着什么,因为我在遵循include路径时遇到了问题。你应该向项目IMHO提交一份bug报告以了解更多信息。如果可以,请在回答中添加一些代码,并接受答案,以便将此问题标记为已解决。谢谢很高兴你能解决它!