2

我使用工厂来创建一个对象和静态方法来反序列化这个对象:

public static function factory($idText) {
    $fetchedObject = self::fetchStoredObject($idText);
    return $fetchedObject;
}

private static function fetchStoredObject($idText) {
    $fetchedText = DB::select()
                    ->from(table)
                    ->where('idText', '=', $idText)
                    ->execute()->as_array();
    if (!empty($fetchedText)) {
        return unserialize(base64_decode($fetchedText[0]['txtContent']));
    } else {
        return NULL;
    }
}

对象是这样创建的:

$text = Article::factory($idText);

但我收到以下错误:

unserialize() [<a href='function.unserialize'>function.unserialize</a>]: 
Function spl_autoload_call() hasn't defined the class it was called for

在这行fetchStoredObject方法上:

return unserialize(base64_decode($fetchedText[0]['txtContent']));

为什么会出现这个错误?

编辑

我的班级结构如下:

class Article {
    private $phpMorphy;
    private $words; //contains instances of class Word
    ...
    private function __construct($idText) {
        $this->initPhpMorphy(); // $this->phpMorphy gets reference to the object here
    }

    public function __sleep() {
        return Array(
            'rawText',
            'idText',
            'properties',
            'words',
            'links'
        );
    }

public function __wakeup() {
    $this->initPhpMorphy();
}

}

该类Word不包含对 phpMorphy 的引用作为自己的属性,但在其方法中将其用作函数参数。这是序列化字符串的一部分:

" Article words";a:107:{i:0;O:4:"Word":10:{s:5:" * id";O:9:"phpMorphy":7:{s:18:" * storage_factory";O:25:

看来 phpMorphy 是通过与 Word 类的连接进行序列化的。我对吗?

4

3 回答 3

4

发生错误是因为在您的序列化字符串中存在对尚未包含的类的引用 - 因此触发 PHP 自动加载机制以加载该类,但由于某种原因而失败。

您的调试步骤是:

  1. 确定该序列化字符串中包含哪个类。
  2. 检查您是否在某处有该类的代码。
  3. 确保可以通过自动加载加载此代码。或者,确保在反序列化之前包含该代码。
于 2013-10-22T07:36:46.020 回答
0

你用的是什么版本的PHP?你在哪里存储你的文章类?尝试手动 require() 它。

于 2013-10-22T07:36:36.087 回答
0

由于 Sven 的建议,问题得到了解决。Word 类的对象(Article 类的一部分)包含对 phpMorphy 类的引用(这是因为我在创建单词的实例时更改了参数顺序!)。

于 2013-10-22T08:33:10.130 回答