php中的Unserialize与Autoload
当反序列化一个对象时,如果对象的类定义不存在,那么PHP会引入一个未完成类的概念,即:__PHP_Incomplete_Class,此时虽然我们反序列化成功了,但还是无法访问对象中的数据,否则会出现如下报错信息: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition 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. 这不是什么难事儿,只要做一次强制类型转换,变成数组就可以了:
不过如果系统激活了Autoload,情况会变得复杂些。顺便插句话:PHP其实提供了一个名为unserialize_callback_func配置选项,但意思和autoload差不多,这里就不介绍了,咱们就说autoload,例子如下:
执行上面代码会发现,spl_autoload_register被触发了,多数时候这是有意义的,但如果遇到一个定义不当的spl_autoload_register,就悲催了,比如说下面这段代码:
毫无疑问,因为找不到类定义文件,所以报错 了!改改spl_autoload_register肯定行,但前提是你能改,如果涉及第三方代码,我们就不能擅自做主了,此时我们需要一种方法让 unserialize能绕开autoload,最简单的方法是把我们需要的类FAKE出来:
不得不说,上面的代码真的很垃圾。为大家提供一人我写的:
代码虽然多了点,但至少没有FAKE类,看上是不是舒服多了。 |
上一篇: mysql条件使用or查询不会触发索引?
推荐阅读
-
再谈PHP中单双引号的区别详解,php双引号区别详解_PHP教程
-
php中的Unserialize与Autoload
-
php中邮箱地址正则表达式实现与详解
-
PHP rawurlencode与urlencode函数的深入分析_PHP教程
-
PHP与MySQL数据库中排序的对比及使用条件详解_MySQL
-
php目录操作函数之获取目录与文件的类型
-
php实现parent调用父类的构造方法与被覆写的方法_PHP教程
-
php中判断数组相等的方法以及数组运算符介绍_PHP教程
-
PHP模板引擎Smarty中变量的使用方法示例 php smarty 余国荔 smarty assign
-
PHP中操作MySQL需要注意的问题