在1的基礎(chǔ)上包蓝,我寫(xiě)了段代碼來(lái)實(shí)驗(yàn)自己的理解蒜哀。
<?php
class test
{
public $hello;
function __construct()
// function __destruct()
{
echo "fun".$this->hello;
// eval($this->hello);
}
}
// $a = new test();
// $a->hello = "phpinfo();";
// echo serialize($a);
$b = 'O:4:"test":1:{s:5:"hello";s:10:"phpinfo();";}';
$c = unserialize($b);
?>
我將test類中的hello變量賦值為phpinfo();然后輸出獲取序列化字符串
然后反序列化這個(gè)字符串
本來(lái)我想結(jié)果應(yīng)該是funphpinfo();双揪,但不是视事,沒(méi)有結(jié)果輸出强重。
這段話整篇看完了回過(guò)頭再看...寫(xiě)的邏輯是這樣的
這邊很疑惑监憎,就算hello是空纱意,也應(yīng)該有fun吧。鲸阔。偷霉。但卻是沒(méi)有...希望有大佬指點(diǎn)迷津
但是如果直接new test() 會(huì)有輸出的結(jié)果fun....
懵了,想錯(cuò)了褐筛?
hello已經(jīng)被賦值了啊类少,應(yīng)該會(huì)執(zhí)行的啊...
懵了一會(huì)突然想明白了赊抖。
__construct是類實(shí)例化的時(shí)候執(zhí)行的乙嘀,也就是說(shuō),當(dāng)new test()的時(shí)候晶衷,這個(gè)函數(shù)就執(zhí)行了月腋,而這時(shí)候hello的值還是空的岳链。
所以我把construct改成了destruct踢步,對(duì)象銷毀時(shí)執(zhí)行的函數(shù)萌焰,(代碼全部執(zhí)行完畢才會(huì)執(zhí)行的函數(shù))捧杉。
2333結(jié)果對(duì)了倘核,輸出了funphpinfo;
把echo換成eval泣侮,執(zhí)行了phpinfo(),舒服了。
流程大概就是這樣的:
test類中紧唱,有一個(gè)未賦值的hello變量活尊,和一個(gè)代碼結(jié)束后執(zhí)行的函數(shù)
先new test(),然后將hello的變量值賦值成phpinfo()
代碼執(zhí)行完畢后漏益,會(huì)去eval這個(gè)phpinfo這個(gè)函數(shù)蛹锰。
反序列化做的就是去賦值。
這樣理解起來(lái)感覺(jué)就沒(méi)有那么難了绰疤,哈哈哈铜犬。
(但總覺(jué)得事情應(yīng)該不會(huì)這么簡(jiǎn)單吧,就這個(gè)代碼目前看來(lái)應(yīng)該就是賦值峦睡,想象一些復(fù)雜得場(chǎng)景,幾個(gè)類和方法翎苫,函數(shù)相互調(diào)用,誒榨了,其實(shí)說(shuō)到底也就是賦值吧...只是賦的值和賦值后函數(shù)執(zhí)行的復(fù)雜程度了煎谍。