“如果序列化的字符串包含对无法实例化的类的引用(例如,成为抽象类),PHP将立即死于致命错误。如果在unserialize()语句前加一个'@',以避免使日志混乱发出警告或通知,绝对没有线索说明脚本为什么停止工作。花了我几个小时的时间……”
我在php手册上找到了这个并尝试对其进行测试,但是如果有人可以举个例子,它不会引发致命错误。
答案 0 :(得分:1)
简单的例子:
abstract class Foo {}
unserialize('O:3:"Foo":0:{}');
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:{}}');
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:{}');