這個(gè)問題其實(shí)是和序列化接口相關(guān)的一個(gè)修改。
5.6的更新日志里有寫
5.6.0 Manipulating the serialised data by replacing C: with O: to force object instantiation without calling the constructor will now fail.
大意就是說,5.6不允許將修改已經(jīng)序列化數(shù)據(jù)中的C:改為O:來(lái)避免調(diào)用類中生成器。
我們寫一個(gè)類來(lái)了解這是什么意思,首先我們?cè)赑HP5.3中實(shí)現(xiàn)一個(gè)繼承序列化接口的類
class obj implements Serializable {
public $data;
public function __construct() {
$this->data = "My private data";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
echo 'test';
}
}
$test = new obj();
echo serialize($test);//輸出C:3:"obj":23:{s:15:"My private data";}
var_dump(unserialize('C:3:"obj":23:{s:15:"My private data";}'));//調(diào)用unserialize方法,輸出test
var_dump(unserialize('O:3:"obj":1:{s:4:"data";s:15:"My private data";}'));//沒有調(diào)用unserialize方法,沒有輸出
接下來(lái)我們?cè)?.6中實(shí)驗(yàn)相同的代碼
class obj implements Serializable {
public $data;
public function __construct() {
$this->data = "My private data";
}
public function serialize() {
return serialize($this->data);
}
public function unserialize($data) {
echo 'test';
}
}
$test = new obj();
echo serialize($test);//輸出C:3:"obj":23:{s:15:"My private data";}
var_dump(unserialize('C:3:"obj":23:{s:15:"My private data";}'));//調(diào)用unserialize方法,輸出test
var_dump(unserialize('O:3:"obj":1:{s:4:"data";s:15:"My private data";}'));//拋出了一個(gè)Warning,PHP Warning: Erroneous data format for unserializing 'obj'
所以其實(shí)這個(gè)更新的意思就是說,不能靠修改序列化的數(shù)據(jù),在不調(diào)用對(duì)象構(gòu)造器的情況下實(shí)例化對(duì)象