【问题标题】:__PHP_Incomplete_Class even though class is loaded__PHP_Incomplete_Class 即使加载了类
【发布时间】:2022-01-12 16:38:19
【问题描述】:

我正在尝试缓存 SOAP 响应(具有多个子对象的类对象)。

假设我的响应对象是$responseObject,我用$this->io->save(serialize($responseObject), '/tmp/response.dat');(伪代码)将它保存到一个名为/tmp/response.dat 的文件中。

稍后尝试通过$responseObject = unserialize($this->io->read('/tmp/response.dat')); 获得该响应时(在新请求中)我得到__PHP_Incomplete_Class 即使自动加载所需的类(我正在使用 Magento,因此它在尝试阅读之前很久就自动自动加载文件中的对象),我什至尝试遍历 SOAP 类文件夹和 require()d 以 100% 确保所有类都被包含在内。

A $responseObject = unserialize(serialize($responseObject)); 完美运行,如果 SOAP 调用实际上在之前执行,并且文件中的序列化字符串和调用之后的序列化字符串完全相同 - 它只是仅尝试从文件中反序列化时不起作用,即使我测试迭代地包含所有可能的类(并且存在自动加载器)。

谁能告诉我这里有什么问题?

【问题讨论】:

    标签: php serialization magento2 php-7.4


    【解决方案1】:

    PHP 使用内置的序列化和反序列化方法序列化其会话。 PHP 的序列化具有序列化 PHP 对象(又名类实例)并将它们转换为字符串的能力。当您反序列化这些字符串时,它将它们转换回具有这些值的相同类。具有一些私有属性并希望对其进行编码/解码或在其序列化/反序列化中执行复杂操作的类实现 Serializable 类并向该类添加序列化和反序列化方法。

    当 PHP 的反序列化尝试反序列化一个类对象,但没有声明/要求类名时,它不会给出警告或抛出异常,而是将其转换为 __PHP_Incomplete_Class 的对象。

    如果您不希望会话对象转换为 __PHP_Incomplete_Class,您可以通过在调用 session_start 之前要求类文件或注册自动加载函数来实现。

    【讨论】:

    • 您好,感谢您的回答。我的问题与会话无关,并且在 unserialize() 时需要和声明这些类。不幸的是,我找不到解决此问题的方法。
    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2013-11-04
    • 2011-06-04
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多