我正在使用工厂创建一个对象,并使用静态方法来反序列化该对象:
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类来序列化的。我是对的吗?
答案 0 :(得分:4)
发生错误是因为在序列化字符串中有一个尚未包含的类的引用 - 因此启动了PHP自动加载机制来加载该类,并且由于某种原因这会失败。
您的调试步骤是:
答案 1 :(得分:0)
您使用的是哪个版本的PHP?你在哪里存储你的文章课?尝试手动require()。
答案 2 :(得分:0)
由于Sven的建议,问题得以解决。类Word的对象(类文章的一部分)包含对phpMorphy类的引用(这是因为我在创建单词的实例时更改了参数顺序!)。