php反序列化_2

2019-01-27  本文已影响0人  HOtMI1k

在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这个函数。
反序列化做的就是去赋值。
这样理解起来感觉就没有那么难了,哈哈哈。
(但总觉得事情应该不会这么简单吧,就这个代码目前看来应该就是赋值,想象一些复杂得场景,几个类和方法,函数相互调用,诶,其实说到底也就是赋值吧...只是赋的值和赋值后函数执行的复杂程度了。

上一篇 下一篇

猜你喜欢

热点阅读