unserialize()...函数spl_autoload_call()尚未定义它所调用的类

时间:2013-10-22 07:12:21

标签: php kohana kohana-3

我正在使用工厂创建一个对象,并使用静态方法来反序列化该对象:

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类来序列化的。我是对的吗?

3 个答案:

答案 0 :(得分:4)

发生错误是因为在序列化字符串中有一个尚未包含的类的引用 - 因此启动了PHP自动加载机制来加载该类,并且由于某种原因这会失败。

您的调试步骤是:

  1. 确定该序列化字符串中包含哪个类。
  2. 检查某个地方是否有该类的代码。
  3. 确保可以通过自动加载加载此代码。或者,确保在反序列化之前包含代码。

答案 1 :(得分:0)

您使用的是哪个版本的PHP?你在哪里存储你的文章课?尝试手动require()。

答案 2 :(得分:0)

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