编 写:袁 亮 时 间:2014-04-11 说 明:序列化对象导致的错误 一、问题描述 在迁移blogadmin项目的时候遇到了一个报错:(迁移前php版本:5.2.6、迁移后php版本:5.3.7) Fatal error: PostsController::index(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Information" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition 二、解决过程 1、根据报错信息搜索,查找到文档:http://www.php.net/manual/zh/language.oop5.serialization.php 2、按文档里的说明,结合程序,出现问题的原因是: a、程序中,会把对象存储会话中(session,session会调用php的serialize函数序列化对象) b、在新的页面中,程序从session中,取出数据,并自行调用unserialize函数,反序列化对象,并且正常使用对象 c、以上要正常使用,必须保证对象所对应的类定义要在unserialize之前,否则反序列化出来的对象会有缺失,从而导致错误 d、一般情况下,调整session_start和引用类定义文件的顺序即可 3、根据上述信息,调试程序,发现调用对象的时候,类已经定义,而且类定义的引用在session_start之前 4、经查,发现是该服务器的php配置中,自动开启了session_start,导致session_start永远在类定义前,从而导致错误发生 5、修改php配置,并重启apache即可