美文网首页
PHP--序列化与反序列化详解

PHP--序列化与反序列化详解

作者: 归子莫 | 来源:发表于2020-05-03 10:28 被阅读0次

    PHP--序列化与反序列化详解

    博客说明

    文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

    说明

    学到网络安全的时候用到了序列化和反序列化的操作,感觉挺有用的,首先给出文档地址https://www.php.net/manual/zh/language.oop5.serialization.php

    所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

    为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register()来实现。

    PHP序列化:serialize

    序列化是将变量或对象转换成字符串的过程。

    <?php
    
    class student{
        public $name;
        public $age;
        public $number;
    
        //_construct:创建对象时初始化
        function __construct($name,$age,$number){        
            $this->name = $name;
            $this->age = $age;
            $this->number = $number;
        }
    }
    
    $student = new student("Jack",22,11086);
    var_dump(serialize($student));
    
    ?>
    
    测试运行
    image-20200503100649029
    string(76) "O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}"
    

    PHP反序列化:unserialize

    反序列化是将字符串转换成变量或对象的过程。

    <?php
    
    class student{
        public $name;
        public $age;
        public $number;
    
        //_construct:创建对象时初始化
        function __construct($name,$age,$number){        
            $this->name = $name;
            $this->age = $age;
            $this->number = $number;
        }
    }
    
    $student = 'O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}';
    var_dump(unserialize($student));
    
    ?>
    
    测试运行
    image-20200503101454170
    object(student)#1 (3) {
      ["name"]=>
      string(4) "Jack"
      ["age"]=>
      int(22)
      ["number"]=>
      int(11086)
    }
    

    魔术函数

    函数 说明
    __construct() 类的构造函数
    __destruct() 类的析构函数
    __call() 在对象中调用一个不可访问方法时调用
    __callStatic() 用静态方式中调用一个不可访问方法时调用
    __get() 获得一个类的成员变量时调用
    __set() 设置一个类的成员变量时调用
    __isset() 当对不可访问属性调用isset()或empty()时调用
    __unset() 当对不可访问属性调用unset()时被调用
    __sleep() 执行serialize()时,先会调用这个函数
    __wakeup() 执行unserialize()时,先会调用这个函数
    __toString() 类被当成字符串时的回应方法
    __invoke() 调用函数的方式调用一个对象时的回应方法
    __set_state() 调用var_export()导出类时,此静态方法会被调用
    __clone 当对象复制完成时调用
    __autoload() 尝试加载未定义的类
    __debugInfo() 打印所需调试信息

    为什么突然说到魔术函数呢,因为在序列化和反序列化的时候经常会用到__construct()__destruct()__sleep()__wakeup()

    在后面的博客里面有相应的ctf实例

    感谢

    万能的网络

    以及勤劳的自己

    相关文章

      网友评论

          本文标题:PHP--序列化与反序列化详解

          本文链接:https://www.haomeiwen.com/subject/jifdghtx.html