在1的基础上,我写了段代码来实验自己的理解。
<?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();然后输出获取序列化字符串
然后反序列化这个字符串
本来我想结果应该是funphpinfo();,但不是,没有结果输出。
这段话整篇看完了回过头再看...写的逻辑是这样的
这边很疑惑,就算hello是空,也应该有fun吧。。。但却是没有...希望有大佬指点迷津
但是如果直接new test() 会有输出的结果fun....
懵了,想错了?
hello已经被赋值了啊,应该会执行的啊...
懵了一会突然想明白了。
__construct是类实例化的时候执行的,也就是说,当new test()的时候,这个函数就执行了,而这时候hello的值还是空的。
所以我把construct改成了destruct,对象销毁时执行的函数,(代码全部执行完毕才会执行的函数)。
2333结果对了,输出了funphpinfo;
把echo换成eval,执行了phpinfo(),舒服了。
流程大概就是这样的:
test类中,有一个未赋值的hello变量,和一个代码结束后执行的函数
先new test(),然后将hello的变量值赋值成phpinfo()
代码执行完毕后,会去eval这个phpinfo这个函数。
反序列化做的就是去赋值。
这样理解起来感觉就没有那么难了,哈哈哈。
(但总觉得事情应该不会这么简单吧,就这个代码目前看来应该就是赋值,想象一些复杂得场景,几个类和方法,函数相互调用,诶,其实说到底也就是赋值吧...只是赋的值和赋值后函数执行的复杂程度了。
网友评论