副问题[/!--empirenews.page--]
要进修PHP反序列裂痕,先相识下PHP序列化和反序列化是什么对象。
php措施为了生涯和转储工具,提供了序列化的要领,php序列化是为了在措施运行的进程中对工具举办转储而发生的。序列化可以将工具转换成字符串,但仅保存工具里的成员变量,不保存函数要领。
php序列化的函数为serialize。反序列化的函数为unserialize。
序列化
举个栗子:
- <?php
- class Test{
- public$a = 'ThisA';
- protected$b = 'ThisB';
- private$c = 'ThisC';
- publicfunction test1(){
- return'this is test1 ';
- }
- }
- $test = new Test();
- var_dump(serialize($test));
- ?>
输出:

表明一下:
O代表是工具;:4暗示改工签字称有4个字符;:”Test”暗示改工具的名称;:3暗示改工具里有3个成员。
接着是括号内里的。我们这个类的三个成员变量因为变量前的修饰差异,在序列化出来后表现的也差异。
第一个变量a序列化后为 s:1:”a”;s:5:”ThisA”;
因为变量是有变量名和值的。以是序列化必要把这两个都举办转换。序列化后的字符串以分号支解每一个变量的特征。
这个要按照分号来分隔看,分号左边的是变量名,分号右边的是变量的值。
先看左边的。着实都是同理的。s暗示是字符串,1暗示该字符串中只有一个字符,”a”暗示该字符串为a。右边的同理可得。
第二个变量和第一个变量有所差异,多了个乱码和 * 号。这是由于第一个变量a是public属性,而第二个变量b是protected属性,php为了区别这些属性以是举办了一些修饰。这个乱码查了下资料,着实是 %00(url编码,hex也就是0×00)。暗示的是NULL。以是protected属性的暗示方法是在变量名前加个%00*%00
第三个变量的属性是private。暗示方法是在变量名前加上%00类名%00
可以看到固然Test类中有test1这个要领,可是序列化后的字符串中并没有包括这个要领的信息。以是序列化不生涯要领。
反序列化
- <?php
-
- class Test{
-
- public$a = 'ThisA';
-
- protected$b = 'ThisB';
-
- private$c = 'ThisC';
-
- publicfunction test1(){
-
- return'this is test1 ';
-
- }
-
- }
-
- $test = new Test();
-
- $sTest = serialize($test);
-
- $usTest = unserialize($sTest);
-
- var_dump($usTest);
-
- ?>
输出:

可以看到类的成员变量被还原了,可是类要领没有被还原,由于序列化的时辰就没生涯要领。
把戏要领
或许相识了php序列化和序列化的进程,那么就来先容一下相干的把戏要领。
- construct 当一个工具建设时被挪用
- destruct 当一个工具烧毁时被挪用
- toString 当一个工具被看成一个字符串行使
- sleep 在工具被序列化之前运行
- wakeup 在工具被反序列化之后被挪用
直接举栗子吧:
- <?php
- classTest{
- public function __construct(){
- echo 'construct run';
- }
- public function __destruct(){
- echo 'destruct run';
- }
- public function __toString(){
- echo 'toString run';
- }
- public function __sleep(){
- echo 'sleep run';
- }
- public function __wakeup(){
- echo 'wakeup run';
- }
- }
- /**/
- echo'new了一个工具,工具被建设,执行__construct</br>';
- $test= new Test();
- /**/
- echo'</br>serialize了一个工具,工具被序列化,先执行__sleep,再序列化</br>';
- $sTest= serialize($test);
- /**/
- echo'</br>unserialize了一个序列化字符串,工具被反序列化,先反序列化,再执行__wakeup</br>';
- $usTest= unserialize($sTest);
- /**/
- echo'</br>把Test这个工具当做字符串行使了,执行__toString</br>';
- $string= 'hello class ' . $test;
- /**/
- echo'</br>措施运行完毕,工具自动烧毁,执行__destruct</br>';
- ?>
输出:

(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|