为什么下面的代码反序列化要大于1?

我想要达到的结果

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

class xctf{
public $flag = '111';
}
$a=new xctf();
echo serialize($a);
O:4:"xctf":2:{s:4:"flag";s:3:"111";}

为什么xctf后面的数字要大于1?为什么反序列化要删除__wakeup方法?

1.首先是xctf后面的数字为什么要大于1?
因为unserialize()反序列化时,会自动调用__wakeup魔术方法,但是这个方法里面是exit,直接退出了,所以需要绕过exit,不让它执行。绕过的方法就是让序列化字符串中object的个数大于真实的object个数。所以要比1大。
2.至于第二个问题为什么要删除wakeup?
不是删除它,是绕过它,不让它执行。

当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
O:4:"xctf":1:{s:4:"flag";s:3:"111";} 它本来是只有一个对象,但是你改成2. O:4:"xctf":2:{s:4:"flag";s:3:"111";}