序列化的字符串包含对无法实例化的类的引用

时间:2018-11-15 11:37:29

标签: php serialization

“如果序列化的字符串包含对无法实例化的类的引用(例如,成为抽象类),PHP将立即死于致命错误。如果在unserialize()语句前加一个'@',以避免使日志混乱发出警告或通知,绝对没有线索说明脚本为什么停止工作。花了我几个小时的时间……”

我在php手册上找到了这个并尝试对其进行测试,但是如果有人可以举个例子,它不会引发致命错误。

1 个答案:

答案 0 :(得分:1)

简单的例子:

abstract class Foo {}
unserialize('O:3:"Foo":0:{}');

gives

Fatal error: Uncaught Error: Cannot instantiate abstract class Foo in /in/A4TCW:4 Stack trace:
#0 /in/A4TCW(4): unserialize('O:3:"Foo":0:{}')
#1 {main}   thrown in /in/A4TCW on line 4

仅仅是根对象还是其属性都没关系:

abstract class Foo {}
class Bar extends Foo {}
unserialize('O:3:"Bar":1:{s:1:"a";O:3:"Foo":0:{}}');

get the same result

Fatal error: Uncaught Error: Cannot instantiate abstract class Foo in /in/ZkdMk:5
Stack trace:
#0 /in/ZkdMk(5): unserialize('O:3:"Bar":1:{s:...')
#1 {main}
  thrown in /in/ZkdMk on line 5

反序列化仅扩展抽象类的内容不是问题,也不是您的报价所暗示的。

abstract class Foo {}
class Bar extends Foo {}
unserialize('O:3:"Bar":0:{}');

works fine